阶段提交
ACID原则
ACID是一种描述一致性的原则,通常出现在数据库系统中。
- A Atomicity: 原子性,事务中的所有操作要么不成功,要么都成功
- C Consistency: 一致性,外界访问数据库中的数据时,不会访问到事物的中间状态,只会访问到最终的状态
- I Isolation: 隔离性,事务可以并发执行,不会互相影响。
- D Duration: 持久性,一旦事务提交成功,状态的改变是持久的,不会失效。
单机事务一般是需要满足ACID的。
分布式事务需要多节点协作来完成一个事务,其实现方式和单机事务有很大不同,也很难满足ACID原则,实现方式和单机事务的实现方式也有很大不同。目前分布式事务是通过阶段提交来实现的,阶段提交分为二阶段和三阶段提交。
二阶段提交
可将其分解为预提交和正式提交两个阶段。
- 预提交:协调者(Coordinator)发起提交某个事务的申请,各参与执行者(Participant)需要尝试提交并反馈是否能完成。
- 正式提交:协调者如果得到所有执行者的成功答复,则发出正式提交请求。如果成功完成,则算法执行成功。
在提交过程如果出现问题,事务就需要回退。
优点是实现简单,但缺点很明显就是它的整个过程是阻塞的,需要等到所有节点完成才能执行下一步,会使性能较差。当一个节点出现问题,可能会造成事务一直无法提交。在第二个阶段协调者和参与者出现故障,也会造成数据不一致的情况。
三阶段提交
三阶段提交其实就是对二阶段提交的扩展,分为三步
- 尝试提交 协调者会询问各个节点是否能参与投票,如果不能就不会再执行下去
- 预提交 如果所有节点都返回可以执行投票,所有的参与者就会尝试进行提交并且反馈是否能够完成。
- 正式提交 协调者如果得到所有执行者的成功答复,则发出正式提交申请,如果成功完成,则本次事务成功
三阶段提交只是在一定程度上缓解了提交冲突问题,还是无法保证数据一致性的问题。一致性可以参考Paxos