分布式 — ACID 理论

ACID 理论是对事务特性的抽象和总结,方便我们实现事务。可以理解成,如果实现了操作的 ACID 特性,那么就实现了事务,在单机上实现 ACID 并不难,但是如何实现分布式的事务呢?

一、二阶段提交协议

两阶段提交(Two-phase Commit,2PC),通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。

1. 运行过程

I. 准备阶段

协调者询问参与者事务是否执行成功,参与者发回事务执行结果。询问可以看成一种投票,需要参与者都同意才能执行。

II. 提交阶段

如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。

需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。

2. 存在的问题

I. 同步阻塞

所有事务参与者在等待其它参与者响应的时候都处于同步阻塞等待状态,无法进行其它操作。

II. 单点问题

协调者在 2PC 中起到非常大的作用,发生故障将会造成很大影响。特别是在提交阶段发生故障,所有参与者会一直同步阻塞等待,无法完成其它操作。

III. 数据不一致

在提交阶段,如果协调者只发送了部分 Commit 消息,此时网络发生异常,那么只有部分参与者接收到 Commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。

IV. 太过保守

任意一个节点失败就会导致整个事务失败,没有完善的容错机制。

二、TCC

TCC 是 Try(预留)、Confirm(确认)、Cancel(撤销)3 个操作的简称,它包含了预留、确认/撤销这两个阶段。核心思想是:针对每个操作都要注册一个与其对应的确认和补偿(撤销操作)。

TCC 事务的处理流程与 2PC 类似,不过 2PC 通常都是在跨库的 DB 层面,而 TCC 本质上就是一个应用层面的 2PC,需要通过业务逻辑来实现。这种分布式事务的实现方式的优势在于,可以让应用自己定义数据库操作的粒度,使得降低锁冲突、提高吞吐量。

参考