seata的AT模式
seata是阿里开源的一个分布式事务解决方案
seata三大组件
TC: 事务协调器, 这是一个独立服务, 不包含业务代码, 负责全局事务统一调度, 比如维护全局事务状态、通知RM执行分支事务提交/回滚
TM: 事务管理器, 对应微服务中的聚合服务, 负责发起一个全局事务,或结束(提交/回滚)一个全局事务
RC: 资源管理器, 对应微服务中的某个微服务 (也可以理解为管理数据库链接的对象) 负责注册和执行某个事务分支
AT(auto-commit transaction)是seata支持的一种事务模式, 是基于2PC协议的, 通过代理数据源, 使本地事务和全局事务能够统一管理
优点: 无侵入性, 不需要改造代码
缺点: 需要部署seata服务, 配置对应的数据库表
注意: 这个模式仅支持具有ACID特性的关系型数据库
==使用起来是非常简单的, 只需要引入@GlobalTransactional注解==
@GlobalTransactional
public void method(Long id, Long busId){
//远程服务A
Long aId = remoteServiceA.method(id, busId)
//远程服务B
remoteServiceB.method(aId);
}
两阶段主要干了啥事
一阶段
1、RM解析本地事务要执行的SQL 比如sql的类型是insert还是update、修改的表是哪个、where条件是那些等
2、RM得到解析结果后, 执行SQL,并生成变更前后快照, 步骤如下
进行一次查询, 生成变更前快照before image
执行sql语句
在查询一次, 生成变更后的快照after image
3、将更新前后快照和sql信息打包成一条回滚日志, 插入undo_log表
4、提交前去TC注册事务分支, 并申请本次需改记录需要的排他锁
5、将本次数据更新和上面的undo_log回滚日志一并提交
6、把本地事务执行结果上报给TC
二阶段
一阶段分支事务执行完后, TM向TC发起全局事务提交请求, TC会发起投票询问所有RM是否可以提交事务 。
提交: 所有RM分支事务都执行成功了, TC就释放本次全局事务上的锁, 异步调用RM清除undo_log
回滚: 有RM分支事务执行失败了或者网络故障了, TC就协调进行回滚, 步骤如下:
1、用XID和Branch ID查找相应的undo_log记录
2、对比当前数据和after image,
一致
说明提交成功, 用before image和sql信息执行回滚sql
不一致
说明提交失败, 需要比较before image和after image
这俩如果一致说明提交失败或已经回滚无需处理
这俩如果不一致说明有脏数据, 需要抛出异常人工处理
3、执行完回滚sql,提交事务,并将结果上报给TC
标签:回滚,seata,事务,模式,提交,RM,TC
From: https://blog.csdn.net/weixin_44541808/article/details/143560142