3.2. 异步提交

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

文章插图

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

文章插图

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

文章插图
4. 回滚全局事务

文章插图

文章插图

文章插图

文章插图

文章插图

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

文章插图
5. 分支上报
RM向TC报告分支事务状态

文章插图

文章插图
只是更新一下分支状态及相关数据
6. 查询全局事务状态

文章插图
7. 查询全局锁

文章插图

文章插图

文章插图
挑RedisLocker看一下吧

文章插图
关于Seata Server 的源码学习就先到这里,欢迎交流,多谢点赞 (^_^)
【Seata Server 1.5.2 源码学习】
经验总结扩展阅读
- 观察者 CH58X/CH57X/V208 Observer例程讨论讲解
- Seata 1.5.2 源码学习
- Sql Server性能排查和优化懒人攻略
- 分布式事务框架 Seata 入门案例
- Azure DevOps Server 入门实践与安装部署
- 【Serverless】快速集成云函数HarmonyOS
- Eureka Server 实现在线扩容
- Seata 环境搭建
- 【Serverless】云函数微信小程序
- SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截