2PC(二段提交)
- 准备阶段: 协调者会给各参与者发送准备命令,可以理解成除了提交事务之外啥事都做好了
- 提交阶段: 分为提交(回滚事务,提交事务)
3PC(三段提交)
- 准备阶段: 会先去询问此时的参与者是否有条件接这个事务。
- 预提交阶段: 提交前的操作
- 提交阶段: 提交
TTC(补偿事务)
2PC和3PC都是数据库层面的,而TCC是业务层面的分布式事务。
- Try指的是预留,即资源的预留和锁定,注意是预留。
- Confirm指的是确认操作,这一步其实就是真正的执行了。
- Cancel指的是撤销操作,可以理解为把预留阶段的动作撤销了。
confirm和cancel接口还必须实现幂等性。
本地消息表
本地消息表其实就是利用了各系统本地的事务来实现分布式事务。
本地消息顾名思义就是会有一张存放本地消息的表,一般都是放在数据库中,然后再执行业务的时候将业务的执行和将消息放入消息表中的操作放在同一个事物中,这样就能保证消息放入本地表中业务肯定是执行成功的。
调用成功,消息表的消息状态可以直接改成已成功。
调用失败, 会有后台任务定时去读取本地消息表,未成功的消息重复调用,会设置重试最大次数。
可以看到本地消息表其实实现的是最终一致性,容忍了暂时不一致的情况。
消息事务
RocketMQ 就很好的支持了消息事务
- 发送prepare消息到消息中间件
- 发送成功后,执行本地事务
- 如果事务执行成功,则commit,消息中间件消息下发至消费端(commit前,消息不会被消费)
- 如果事务执行失败,则回滚,消息中间件将这条prepare消息删除
- 消费端接收到消息进行消费,如果消费失败,则不断重试