最近接手了一个项目需要在上面新加一个模块,我这边直接把之前的模块复制一份改改,去掉多余的文件就开始写了,但是就在一小时前,我调试接口的时候突然就发现事务回滚失效了,准确的说是事务都没有正常开启,这他么的咋回事?
因为刚接手这个项目才一周,它的架构也不是很熟,然后这个模块又很急需要一周做完,所以只能先常规问题检一遍,但是发现都不行
直到刚刚我加了下面这个文件,这个是显示的配置数据源的,正常情况不需要配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.support.TransactionTemplate;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
}
然后报了个错
[2024-06-14 19:50:01.038] [ERROR c.y.c.j.c.ExceptionController.globalException:86] ~~~~~~exception=No qualifying bean of type 'org.springframework.transaction.TransactionManager' available: expected single matching bean but found 2: transactionManager,rabbitTransactionManager
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.TransactionManager' available: expected single matching bean but found 2: transactionManager,rabbitTransactionManager
重点在 expected single matching bean but found 2: transactionManager,rabbitTransactionManager
发现了两个数据源,其中有一个是rabbitTransactionManager
这样问题就好解决,既然是双数据导致的,那就指定一下数据源
这里给它加个注解@Primary
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.support.TransactionTemplate;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
public class TransactionManagerConfig {
@Bean
@Primary
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
return new TransactionTemplate(transactionManager);
}
}
到这里这个问题就解决
当然我还是很生气的,今天周五!现在八点了我还没下班!所以我又去之前复制的那个模块试了一下别人写的代码,我想知道我复制后是不是删了什么配置文件或者哪里没配置好才出现的这个问题,然后!他么的原模块事务就已经没有生效!!!法克!之前同事还跟我说这个项目二十多个人开发了两年,两年事务没生效没一个人发现?难怪原先做这个项目的公司倒闭了!活该啊!!!