Seata Server 1.5.2 源码学习( 三 )


3.2. 异步提交

Seata Server 1.5.2 源码学习

文章插图
异步提交只是将全局状态置为异步提交中,剩下的事情交给定时任务去执行
启动的时候调用了DefaultCoordinator#init()方法,启动定时任务
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
每次,定时任务执行前,要先获取一把分布式锁,这个锁是io.seata.core.store.DistributedLocker,不是分支注册时的那把锁io.seata.core.lock.Locker
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
异步提交首先将全局状态设置为AsyncCommitting,返回返回全局状态Committed 。后台有定时任务扫描,找到所有状态为AsyncCommitting的全局事务,循环遍历 。对于每个全局事务提交,调用DefaultCore#doGlobalCommit(),遍历所有已注册的分支事务,向分支事务发请求,通知其提交事务,分支事务返回二阶段提交成功,表示该分支事务提交成功,当所有分支事务都二阶段提交成功,则全局事务提交成功 。
Seata Server 1.5.2 源码学习

文章插图
4. 回滚全局事务
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
回滚,首先检查全局事务状态是否为Begin,不是的话直接结束 。遍历当前全局事务中已注册的分支事务,依次给每个分支发请求,告诉分支事务需要回滚 。如果所有分支返回回滚成功,则全局回滚成功 。如果有分支回滚失败且不重试,则直接直接结束 。如果失败且可重试,或者执行过程中抛异常,则稍后会有定时任务重试回滚操作 。
Seata Server 1.5.2 源码学习

文章插图
5. 分支上报
RM向TC报告分支事务状态
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
只是更新一下分支状态及相关数据
6. 查询全局事务状态
Seata Server 1.5.2 源码学习

文章插图
7. 查询全局锁
Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图

Seata Server 1.5.2 源码学习

文章插图
挑RedisLocker看一下吧
Seata Server 1.5.2 源码学习

文章插图
关于Seata Server 的源码学习就先到这里,欢迎交流,多谢点赞 (^_^)
【Seata Server 1.5.2 源码学习】

经验总结扩展阅读