1. seata分布式事务简介
seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata提供了AT、TCC、SAGA和XA事务模型,为用户打造一站式的分布式解决方案。
简单来说,Seata就是针对主流事务解决方案的封装,我们直接使用Seata这个框架就可以选择性的使用不同的事务模型来解决分布式事务问题。
2. seata中的AT事务模型
AT模式实际上是2PC协议的一种演变方式,也是通过两个阶段的提交或者回滚来保证多节点事务的一致性,它的工作模型如下图所示。

具体工作流程说明如下:
1. 第一阶段, 应用系统会把一个业务数据的事务操作和回滚日志记录在同一个本地事务中提交,在提交之前,会向TC(seata server)注册事务分支,并申请针对本次事务操作的表的全局锁。 接着提交本地事务,本地事务会提交业务数据的事务操作以及UNDO LOG,放在一个事务中提交。
2. 第二个阶段,这一个阶段会根据参与到同一个XID下所有事务分支在第一个阶段的执行结果来决定事务的提交或者回滚,这个回滚或者提交是TC来决定的,它会告诉当前XID下的所有事务分支,提交或者回滚。
- 如果是提交, 则把提交请求放入到一个异步任务队列,并且马上返回提交成功给到TC,这样可以避免阻塞问题。而这个异步任务,只 需要删除UNDO LOG就行,因为原本的事务已经提交了。
- 如果是回滚,则开启一个本地事务,执行以下操作
- 通过XID和Branch ID查找到响应的UNDO LOG记录
- 数据校验,拿到UNDO LOG中after image(修改之后的数据)和当前数据进行比较,如果有不同,说明数据被当前全局 事务之外的动作做了修改,这种情况需要根据配置策略来做处理。
- 根据UNDO LOG中的before image和业务SQL的相关信息生成并执行回滚语句
- 提交本地事务,并把本地事务的执行结果上报给TC
2.1 AT模式原理详解
假设存在一个业务表product,表结构如下:
| Field | Type | Key |
| id | bigint(20) | PRI |
| name | varchar(100) | |
| since | varchar(100) |
这个表中,有一条对应的数据:
| id | name | since |
| 1 | TXC | 2024 |
假设AT模式下的其中一个分支事务的执行业务逻辑对应的sql语句如下:
update product set name = 'GTS' where name = 'TXC';
在Seata的AT模式下,执行的过程如下:
AT模式第一阶段
这个阶段主要分为两个过程。
- 执行数据的修改
- 记录回滚日志
具体过程如下:
1. 解析前面的 Update 语句,得到SQL类型(UPDATE)、表(Product)、条件(where name ='TXC')等相关信息。2. 根据解析到的条件信息,生成一条查询语句用来查询修改之前的数据状态select id , name , since from product where name = 'TXC'<

最低0.47元/天 解锁文章
6366

被折叠的 条评论
为什么被折叠?



