spring-kafka导致spring事务失效的解决办法
spring-boot版本:2.1.16.RELEASE
spring-kafka版本:2.2.14.RELEASE
数据库:mybatis-plus + oracle
发现问题
一个spring-boot工程,已经通过配置spring.kafka.producer.transactionIdPrefix
开启KafkaTemplate的executeInTransaction
事务功能。因为业务上需要发送kafka消息后同时更新数据库记录状态,结果发现单元测试跑完后数据库并不会回滚。
调试过程
- 测试类已经使用
@SpringBootTest
@RunWith(SpringRunner.class)
@Transactional
进行标注,@Rollback标注在类上或者测试方法上均无效。
- 数据库操作的service方法已经标注@Transactional,在此方法内下断点,通过Evaluate Expression
TransactionSynchronizationManager#isSynchronizationActive()
发现结果是false - 定位到
TransactionAspectSupport#determineTransactionManager
方法,发现此方法返回了一个类型为KafkaTransactionManager
的对象,至此问题初步定位为spring没有拿到正确的transcationManager
源码分析
查看KafkaAutoConfiguration
发现注册了KafkaTransactionManager
对象,这个类还继承了AbstractPlatformTransactionManager
因为项目使用的mybaits-plus,并配置了spring.datasource
&