深入学习 Seata 也有段时间,包括了解各个事务模式的原理以及分析实现的源码。由于只分析了 AT 和 TCC 事务模式的代码以及篇幅限制,所以下面仅涉及到 AT 事务模式的主要几个处理流程。
源码分析
AT事务模式
开启全局事务
源码中没有发现 Seata 修改事务管理器的处理流程,只是拦截 @GlobalTransactional 注解的方法,在实际方法调用前发 RPC 请求到 TC 事务协调者注册全局事务。
注册分支事务
Seata 通过代理数据源以及相关的其它类,实现在实际事务提交前发 RPC 请求到 TC 事务协调者注册分支事务。在 ConnectionProxy.commit 方法中也负责把回滚日志记录插入到 UNDO_LOG 表。
通知TC提交全局事务
同个全局事务中可能会有多个TM事务管理器参与,其中只有开启全局事务的事务管理器才会发 RPC 请求到 TC 事务协调者要求提交全局事务。
TC通知分支事务提交
客户端处理分支事务提交的代码不如上面几个流程清晰,按照官方文档是客户端处理分支事务提交时是异步删除 UNDO_LOG 中对应的回滚日志记录即可。
参考资料
- 官方文档 seata.io/zh-cn/docs/…
- 官方博客 seata.io/zh-cn/blog/…