10.Seata实现2PC事务-seata执行流程分析

Seata执行流程

正常提交流程

image
  • 在哪里开启了全局事务,TM就在那里
  • @GlobalTransactional这个方法是开启全局事务的起点,向TC开启全局事务
  • 以全局事务ID注册分支事务返回分支事务ID
  • 执行业务数据,上报分支事务处理结果
  • 提交全局事务
  • 分支事务在一阶段已经提交了
  • 所在提交的时候不会再扣减金额
  • 只需要把undo_log删除掉

回滚流程

image
  • 和正常提交流程一样,但是分支事务在提交的时候可能会出错,这时候这个代理会拦截到这个错误,然后向TC报告
  • TC就会知道这个全局事务有一个分支出错了,这时候就进行回滚
  • TM向TC提交回滚全局事务
  • 然后TC会向各个RM发起回滚
  • undo_log记录原始数据,及修改后的数据
  • 解析undo_log,执行反向操作
  • 上报回滚状态

要点说明

  • 1.每一个RM使用DataSourceProxy连接数据库,其目的是使用ConnectionProxy,使用数据源和数据连接代理的目的就是在第一阶段将undo_log和业务数据放在一个本地事务提交,这样就保存了只要业务操作就一定有undo_log。
  • 2.在第一个阶段undo_log中存放了数据修改前和修改后的值,为了事务回滚作好准备,所以第一阶段完成就已经将分支事务提交,也就释放了锁资源。
  • 3.TM开启全局事务开始,将XID全局事务ID放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务将自己的Branch ID分支事务ID与XID关联。
  • 4.第二阶段全局事务提交,TC会通知各各分支参与者提交分支事务,在第一个阶段就已经提交了分支事务,这里各各参与者只需要删除undo_log即可,并且可以异步执行,第二阶段很快可以完成。
  • 5.第二阶段全局事务回滚,TC会通知各各分支参与者回滚分支事务,通过XID和Branch ID找到相应的回滚日志,通过回滚日志生成反向的SQL并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。

你可能感兴趣的:(10.Seata实现2PC事务-seata执行流程分析)