第一阶段,即 prepare 阶段,节点 A 和节点 B 分别检查账户 UA 和 UB 的状态是否正常、账户 UA 的余额充足且可以转出(没有超限)、账户 UB 可以转入(没有被冻结),检查通过则锁定账户 UA 和 UB。

    第二阶段,即 commit 阶段,如果在第一阶段账户 UA 和 UB 的 prepare 操作都成功,则通知节点 A 对账户 UA 的余额进行扣减和通知节点 B 对账户 UB 的余额进行添加,转账成功;否则通知节点 A 和节点 B 对相应账户的操作进行回滚,转账取消。

    Paxos + 两阶段提交协议:

    分布式事务.jpg

    为了提升系统的分布式事务处理能力,降低延迟,OceanBase 数据库进一步改进了传统的两阶段提交协议,采用参与者即协调者的优化,让每个分布式事务的第一个参与者承担两阶段提交协议中协调者的工作。如上图所示,传统的两阶段提交协议包含独立的协调者,协调者维护分布式事务的状态,执行 prepare 和 commit 操作后应答客户端,且每一个操作之前都需要记录日志,用于协调者故障后恢复分布式事务的状态,一次两阶段提交的延迟相当于 2 次 RPC 和 4 次写日志操作。OceanBase 数据库采用协调者无状态设计,协调者不再维护分布式事务的状态,而是在宕机恢复时,通过所有参与者的局部状态动态构造分布式事务的全局状态。这种方式避免了协调者写日志,一次两阶段提交的延迟降低到 1 次 RPC 和 1 次写日志操作。