写点什么

seata 分布式事务 AT 模式介绍(二)

  • 2021 年 12 月 30 日
  • 本文字数:1413 字

    阅读完需:约 5 分钟

作者:ptti

来源:恒生LIGHT云社区


通过前面一篇 seata入门介绍与seata-service部署与验证 我们已经搭建了 seata-service,并做了简单验证。我们知道 seata 定义了三个角色,TC,TM,RM


1363

可以看到大体流程如下:

  • 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


1364


我们总结以下 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云社区,由恒生电子搭建的金融科技专业社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。


扫描下方小程序二维码,加入我们!



发布于: 刚刚
用户头像

还未添加个人签名 2018.11.07 加入

还未添加个人简介

评论

发布
暂无评论
seata分布式事务AT模式介绍(二)