七种常见分布式事务

  1. 七种常见分布式事务
    1. 2pc:两阶段提交,准备阶段和提交阶段
    2. 3pc:针对2pc进行改进
    3. tcc
    4. saga
    5. 本地消息表
    6. MQ事务消息
    7. 最大努力通知(定期校对)

七种常见分布式事务

2pc:两阶段提交,准备阶段和提交阶段

准备阶段:由事务协调者询问通知每个事务参与者,是否准备好执行事务

image-20240328121635423提交阶段:所有参与l参与者都同意,意味着完成事务,要么都commit要么都rollback

image-20240328121719108

image-20240328121738963

问题:可靠性和数据一致性问题

3pc:针对2pc进行改进

协调者和参与者引入超时机制;第一阶段和第二阶段中间插入一个准备阶段,保证在最后提交阶段之前各参与节点的状态保持一致

分为CanCommit,PreCommit,DoCommit阶段

image-20240328122005515

precommit:

  1. 执行事务:假如所有参与者反馈yes,协调者预执行事务,
  • 发送预提交请求:协调者向参与者发送precommit请求,进入准备阶段
  • 事务预处理:参与者接收到precommit请求后,执行本地事务操作,并将undo和redo信息记录到事务日志中。(并不提交事务)
  • 提交反馈:如果参与者成功的执行了事务操作,返回ack响应,同时等待最终命令

image-20240328140033077
2. 中断事务:假设其中任何一个参与者反馈了no,或者等待超时,那么就执行事务中断。

  • 发送中断请求:协调者向所有参与者发送abort请求
  • 中断事务:参与者收到abort请求后,执行事务中断

image-20240328140545363

docommit:

  1. 提交事务:
  • 发送提交请求:接收到所有参与者的ack确认,从预提交变为提交,从所有参与者发送docommit
  • 本地事务提交:参与者接收到docommit请求之后,执行正式事务,提交之后释放事务资源
  • 响应反馈:事务提交完,向协调者发送ack响应
  • 完成事务:协调者接收到所有参与者的ack响应之后,完成事务

image-20240328141627493

  1. 中断事务:任何一个参与者反馈no,或者等待超时
  • 发送中断请求:协调者向参与者发送abort请求
  • 事务回滚:参与者接收abort之后,利用undo信息回滚,释放资源
  • 反馈结果:完成回滚之后,向协调者反馈ack消息
  • 中断事务:协调者接收到所有ack消息后,中断事务

image-20240328141959187
3pc依然无法解决数据不一致问题,当参与者收到precommit请求后等待docommit指令时,如果协调者请求中断事务,而协调者因为网络问题无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。

tcc

saga

本地消息表

MQ事务消息

基于mq的分布式事务本质上是对本地消息表的封装,整体流程与本地消息表一致,唯一不同的将本地消息存在了mq内部,而不是业务数据库中

image-20240328143239908

最大努力通知(定期校对)

对mq事务的优化,在事务主动方增加了消息校对的接口,如果事务被动方没有接收到主动方发送的消息,此时可以调用事务主动方提供的消息校对的接口主动获取。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。