分布式事务 中间件 Seata 源码分析 05 客户端AT模式实现02 第一阶段

AT 实现客户端部分,主要在rm-dataSource中

重点实现还是在statementProxy

 

查看一个execute方法,首先会调用executeTemplate.execute方法

1、首先判断,如果当前不是全局事务,并且没有全局锁,那么就直接execute执行这个sql,返回对应的结果即可

2、如果当前处于全局事务,就先判断SQL的类型,创建不同类型的executor,如下图

  

3.创建好对应sql类型的executor后,就调用execute方法执行,实现都是在BaseTransactionalExecutor中

3.1 如果在全局事务中,需要绑定xid

3.2 如果有全局锁,也需要设置对应的全局锁

3.3 调用doExecute方法执行,实现在AbstractDMLBaseExecutor 中,会调用到executeAutoCommitTrue

   3.3.1 connectionProxy.setAutoCommit(false); 先将自动提交关闭,只允许手动提交

   3.3.2 进入一个while(true)的无限循环,执行executeCommitFalse方法

          1.beforeImage(), 先查询操作数据前的快照

          2.调用statementCallback.execute 执行sql,

          3. afterImage(beforeImage); 查询操作数据后的快照

          4. prepareUndoLog:根据1,3 构建出undoLog,用于回滚

3.4 执行完后,调用commit,提交本地事务,然后break跳出循环

3.5 如果全局锁冲突,代表别的事务已经获取到要修改数据的全局锁,则执行回滚

4.继续深入看下commit,connectionProxy.commit()的具体实现

   

5. processGlobalTransactionCommit 执行全局事务的commit

  5.1 首先是register(), RM注册分支事务

  5.2 如果当前有回滚日志undoLog ,就把undoLog存储到mysql或者oracle

  5.3  targetConnection.commit(); 提交事务

至此 第一阶段提交实现完成

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值