seata分布式

单服务什么情况会不执行事务?
执行sql的ddl语句的时候是没有事务的,dml数据操作sql是有事务的。

Springcloud 如何实现分布式事务 seata?
1.添加seate依赖,配置yml文件
2.数据库中添加回滚日志表 sys_seata_undo_log
3.nacos注册中心配置group项,Server和Client端的值需一致
4.关闭seata的数据源代理 (enable-auto-data-source-proxy=false)
5.使用多数据源代理,开启多数据源对seata的支持(spring.datasource.dynamic.seata=true)
6.在需要发起全局事务的service方法上添加注解 @GlobalTransactional
7.提供方只添加@Transactional保证本地事务

Seata全局事务中涉及三个身份
TC 事务协调者,对应seata服务
TM事务管理者,对应base服务中发起全局事务的方法
RM资源管理者,对应工作流服务

注意问题:
seata通过线程变量 XID 判断TC与RM是否在同一事务下,现支持使用restTemplate与Feign方式发送请求自动携带xid到被调用方,
​ 使用其他方式可将xid放入请求头中,key为"TX_XID",RM会在请求头中自动获取。若采用其他方式需自行保证xid的传递。

被调用方产生异常却没有回滚:
当被调用方RM产生异常时,为了调用方TM可以正确接收到异常状态码,使Feign能抛出异常发起全局事务回滚,RM最好不要添加异常处理去拦截异常。

​ 若RM异常被拦截,需要TM通过Feign返回的自定义的状态码判断被调用方是否产生异常,并手动抛出异常

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值