我是如何基于二阶段递交及悲观锁实现分布式事务的

由于框架一开始的定位就是需要支持强一致性分布式存储,所以如何实现分布式事务成为一个大挑战。作者学习了CockroachDB及TiDB等数据库的实现方式后,决定参考TiDB的实现方式,但不同于使用乐观方式而是采用悲观锁方式,遇到事务冲突采用排队的方式而不是重启事务。

一、二阶段(2PC)递交流程:

参考下图举例说明一下流程:

我是如何基于二阶段递交及悲观锁实现分布式事务的

1. 业务服务开始事务,其所在的节点作为事务协调者新建一个事务实例(使用HLC作为事务开始时间戳);

2. 协调者将命令1加入事务命令列表(如果是第一个命令则作为事务主记录),同时向表1的RaftLeader发送命令,表1状态机处理命令时上锁成功后返回(包含当前节点的HLC);

3. 同步骤2,但记录事务主记录是哪个,用于检测事务状态;

4. 业务服务处理完后通知协调者递交事务,协调者选取所有事务参与者节点最大的HLC作为事务递交时间戳;

推荐阅读