单服务什么情况会不执行事务?
执行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返回的自定义的状态码判断被调用方是否产生异常,并手动抛出异常