使用场景
在项目中使用Seata分布式事务的时候,发现在回滚多个表的时候,有一个表没回滚成功,测试了几次还是不行。使用本地事务 @Transactional 或者使用多数据源事务 @DSTransactional 都能正常的回滚。
原因排查
经过几次测试后,结合本地事务和多数据源事务,大致原因可以指定Seata这边的问题,但是其他表使用分布式事务的时候是正常的,那么问题应该出在表这边。OK,那把表整体结构重新创建,使用新表进行测试,发现事务可以回滚。
原因
最后在SeaTac的配置项目里面,发现了一个配置
原来Seata会将表结构缓存,如果表结构发送变化刚好在使用过程出现其他原因,导致缓存中的表结构没更新掉,那么还是会一直用缓存中的表结构。解决方案有两种方案:一种直接修改配置:client.rm.table.meta.check.enable:true 第二种是直接创建新表,同步数据,不推荐,数据迁移风险比较大。