乐趣区

关于分布式: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、执行业务 SQL
4、查问后镜像:依据前镜像的后果,通过 主键 定位数据。
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 云社区,由恒生电子搭建的金融科技业余社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。

扫描下方小程序二维码,退出咱们!

退出移动版