#seata 问题
引入seata后,spring的本地事务加注解@Transactional 无效
-
在你的配置文件中加入这个
@ConditionalOnMissingBean(PlatformTransactionManager.class) @Bean public PlatformTransactionManager txManager(DataSourceProxy dataSource) { return new DataSourceTransactionManager(dataSource); }
-
经验证本地事务也无效,下面代码无法正常回滚
-
必须使用
@GlobalTransactional
才能回滚 -
验证
@EnableTransactionManagement
开了吗 -
是否所有sql都走
DataSourceProxy
代理;而DataSourceProxy
代理是直接commit代码;所以只能使用@GlobalTransactional
才能执行undo 回滚 -
所以Seata就不支持 spring
@Transactional
的本地事务了? -
支持肯定是支持的 我们现在项目中现在就在用
-
加个logger,看看有没有初始化
-
@ConditionalOnMissingBean(PlatformTransactionManager.class) @Bean public PlatformTransactionManager txManager(DataSourceProxy dataSource) { LOGGER.info("初始化事务管理器:PlatformTransactionManager"); return new DataSourceTransactionManager(dataSource); }
-
如果logger没有输出,说明
TransactionManager
已经自己初始化了,应该用的不是seata的DataSourceProxy
-
有初始化,调用服务方法后就报下面异常
-
DataSource
换成Seata的DataSourceProxy
-
然后改下这个
factoryBean.setTransactionFactory(new SpringManagedTransactionFactory());