• Java注解@Transa1ctional失效特殊情况


    最近接手了一个项目需要在上面新加一个模块,我这边直接把之前的模块复制一份改改,去掉多余的文件就开始写了,但是就在一小时前,我调试接口的时候突然就发现事务回滚失效了,准确的说是事务都没有正常开启,这他么的咋回事?

    因为刚接手这个项目才一周,它的架构也不是很熟,然后这个模块又很急需要一周做完,所以只能先常规问题检一遍,但是发现都不行
    直到刚刚我加了下面这个文件,这个是显示的配置数据源的,正常情况不需要配置

    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);
        }
    }
    

    到这里这个问题就解决

    当然我还是很生气的,今天周五!现在八点了我还没下班!所以我又去之前复制的那个模块试了一下别人写的代码,我想知道我复制后是不是删了什么配置文件或者哪里没配置好才出现的这个问题,然后!他么的原模块事务就已经没有生效!!!法克!之前同事还跟我说这个项目二十多个人开发了两年,两年事务没生效没一个人发现?难怪原先做这个项目的公司倒闭了!活该啊!!!

  • 相关阅读:
    在Linux部署Docker并上传静态资源(快速教程)
    微信小程序通过官方内置函数实现WebSocket
    VScode 配置用户片段
    Dataworks实现接口调用
    【webrtc】sigslot : 继承has_slot 及相关流程和逻辑
    基于差值的图像超分辨率方法
    java项目_第164期ssm定西扶贫惠农推介系统-_java毕业设计_计算机毕业设计
    Educational Codeforces Round 155 (Rated for Div. 2)
    在 Android 12 中使用 widget
    Python —— excel文件操作(超详细)
  • 原文地址:https://blog.csdn.net/cl617287/article/details/139689078