Seata处理分布式事务

Seata处理分布式事务

通过TC、TM、RM三个组件完成:全局事务管理者、事务发起方、事务的参与方。

Seata事务的执行流程(默认是使用二阶段提交):

  • TM开启分布式事务(TM向TC注册全局事务记录)
  • 按业务场景,编排数据库、服务等事务内资源(RM向TC汇报资源准备状态)
  • TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚事务)
  • TC汇总事务信息,决定事务是提交还是回滚
  • TC通知所有的RM提交或回滚资源,事务的二阶段结束。

Seata二阶段提交(AT模式)的原理

首先,我们的Seata服务器搭建好了之后,一般使用数据库搭建,此时会生成一个SeaTa数据库,里面有三张表:global_table、branch_table、lock_table分别对应全局事务、分支事务、全局锁。

global_table: 每当有一个全局事务发起后,就会在该表中记录全局事务的ID。

branch_table: 记录每一个分支事务的ID,分支事务操作的哪个数据库等信息

Seata处理分布式事务

Seata处理分布式事务

lock_table:用于申请全局锁。

一阶段的步骤:

1)开启一个全局事务,在global_table中生成全局事务的ID,以及在branch_table中生成分支事务的ID。

2)在每个本地事务中:执行前置镜像——>执行业务SQL——>执行后置镜像——>插入回滚日志。

前置镜像:查询执行真正业务SQL之前的数据。

后置镜像:业务SQL执行之后的数据,用于回滚时校验数据是否被其他事务修改。

插入回滚数据: 在数据库的UNDO_LOG表中插入SQL执行前后的相关信息(JSON字符串),用于二阶段回滚。

3)本地事务提交:将SQL的执行结果以及UNDO_LOG表的写入数据进行本地事务提交。

二阶段步骤:

1)回滚:若一阶段中任何一个本地事务的提交出错超时等,就执行全局回滚。

  • 通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录
  • 校验当前数据是否与后置镜像数据一致,不一致说明其他事务已经再次修改了数据;若一致则通过UNDO LOG执行回滚语句。
  • 执行完回滚日志后提交本地事务。

2)提交:一阶段所有本地事务均成功时,向全局事务管理器TC返回提交成功的结果。

另外,删除对应的UNDO_LOG日志记录。

相关文章: