seata-AT模式接入
seata AT模式简介
AT模式是 Seata 主推的分布式事务解决方案,它使得应用代码可以像使用本地事物一样使用分布式事物,完全屏蔽了底层细节,主要有以下几点:
- AT模式依赖全局事物注解和代理数据源,其余代码不需要变更,对业务无侵入、接入成本低;
- AT模式的作用范围在于底层数据,通过保存操作行记录的前后快照和生成反向SQL语句进行补偿操作,对上层应用透明;
- AT模式需借助全局锁和GlobalLock注解来解决全局事务间的写冲突问题,如果一阶段分支事物成功则二阶段一开始全局锁即被释放,否则需要等到分支事务二阶段回滚完成才能释放全局锁;
seata AT工作流程
概括来讲,AT 模式的工作流程分为两阶段。一阶段进行业务 SQL 执行,并通过 SQL 拦截、SQL 改写等过程生成修改数据前后的快照(Image),并作为 UndoLog 和业务修改在同一个本地事务中提交。
如果一阶段成功那么二阶段仅仅异步删除刚刚插入的 UndoLog;如果二阶段失败则通过 UndoLog 生成反向 SQL 语句回滚一阶段的数据修改。
springCloud-Feign seata AT接入指南
1. 引入jar包
1 | <!--seata组件包--> |
注意:seata兼容版本说明
2. seata 注册中心配置
registry.conf配置文件,euraka中的application是指seata的服务端的服务器,这边要注意seata server有事物分组的概念,用于不同业务方的集群分区。
1 | registry { |
3. seata 配置中心配置
file.conf配置文件,这里需要注意service中的vgroup_mapping配置,其中vgroup_mapping.my_test_tx_group的my_test_tx_group是表示逻辑服务分组,值表示seata server的实际服务分组,一定要存在seata serve的分组名
1 | transport { |
4. RM 配置服务分组名
application.yml配置文件
1 | spring: |
5. RM 配置 AT 模式
配置代理数据源(DataSourceProxy)即可.
1 |
|
6. TM 全局事物配置
1 |
|
7. 观察日志
TM端启动日志发现注册成功的日志,即可说明配置成功!
1 | 2019-11-14 16:55:33.302 INFO 5420 --- [imeoutChecker_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.202.149:8091 |
测试Demo成功日志如下
TM端日志:
1 | 2019-11-14 17:18:34.841 INFO 5478 --- [nio-8080-exec-7] i.seata.tm.api.DefaultGlobalTransaction : Begin new global transaction [192.168.202.149:8091:2027442865] |
RM端日志:
1 | 2019-11-14 17:18:35.642 INFO 5472 --- [atch_RMROLE_3_8] i.s.core.rpc.netty.RmMessageListener : onMessage:xid=192.168.202.149:8091:2027442865,branchId=2027442870,branchType=AT,resourceId=jdbc:mysql://127.0.0.1:3306/seata-storage,applicationData=null |
TC端日志:
1 | 2019-11-14 17:18:34.828 INFO [batchLoggerPrint_1]io.seata.core.rpc.DefaultServerMessageListenerImpl.run:198 -SeataMergeMessage timeout=60000,transactionName=purchase() |