seata 分布式事务 AT 模式介绍(二)
作者:ptti
来源:恒生LIGHT云社区
通过前面一篇 seata入门介绍与seata-service部署与验证 我们已经搭建了 seata-service,并做了简单验证。我们知道 seata 定义了三个角色,TC,TM,RM
可以看到大体流程如下:
TM 请求 TC,开始一个新的全局事务,TC 会为这个全局事务生成一个 XID。
XID 通过微服务的调用链传递到其他微服务。
RM 把本地事务作为这个 XID 的分支事务注册到 TC。
TM 请求 TC 对这个 XID 进行提交或回滚。
TC 指挥这个 XID 下面的所有分支事务进行提交、回滚。
AT 模式是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。可以参考 SEATA 的官方文档了解简单了解 AT 模式的技术介绍。
https://SEATA.io/zh-cn/docs/dev/mode/at-mode.html
我们总结以下 AT 模式的特点,是基于两阶段事务提交协议演变而成。它通过对 JDBC 访问的代理可以对业务透明(无侵入)的处理事务的回滚,从而确保了在分布式环境下事务操作的原子性,并对以下几个方面做出了改进设计:
业务数据库保存一定的事务状态,减少了通信开销。
提交动作异步化;提升系统的吞吐量,可以更合理的调配资源。
详细执行步骤:
一阶段
1、先解析 sql 语句,得到表名,条件,sql 类型,等信息 2、得到前镜像:根据解析得到的条件信息,生成查询语句,定位数据。3、执行业务 SQL4、查询后镜像:根据前镜像的结果,通过 主键 定位数据。5、插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中。6、提交前,向 TC 注册分支:申请一个主键等于目标数据主键值的全局锁 。7、本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交.8、将本地事务提交的结果上报给 TC。
二阶段-提交
9、收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。10、异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。
二阶段-回滚
9、收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。10、通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。11、数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理,详细的说明在另外的文档中介绍。12、根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句 13、提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。
通过上述步骤可以看到,相比于传统 XA(2PC)的优点:
其实这些也都是 XA 协议(传统 2PC)的缺点
速度更快:
二阶段是异步提交,无需再像 XA 协议那样需要等所有的操作都执行完才进行提交.所谓分支事务的二阶段异步提交,其实就是异步删除 undoLog。因为一阶段的时候已经提交了本地事务,所以二阶段就非常地快速。
高可用性:
他将分布式事物中的协调者独立部署,可以实现高可用(可以开启多个 seata 服务)
不会发生脏读:
因为整个过程 全局锁 在当前全局事务结束前一直是被自己持有的,所以不会发生 脏写 的问题。
当然 AT 模式也是有一些自生的问题和注意事项,所以有一些最佳实践,后续继续探讨。
想向技术大佬们多多取经?开发中遇到的问题何处探讨?如何获取金融科技海量资源?
恒生LIGHT云社区,由恒生电子搭建的金融科技专业社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。
扫描下方小程序二维码,加入我们!
版权声明: 本文为 InfoQ 作者【恒生LIGHT云社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/9c05d2f55a07fc57767d1b0e5】。文章转载请联系作者。
评论