• @Transactional 注解 同一个类下的两个方法


    测试情况

    EaAreaStatisticsSvr.java

    calculateAll方法(有声明式事务注解 事务传播级别为默认 )

    calculateAllByEaArea方法(有声明式事务注解 事务传播级别为默认 访问域为private)

    calculateAll方法调用calculateAllByEaArea方法

    calculateAllByEaArea方法事务不生效

    EaAreaStatisticsSvr.java

    calculateAll方法(有声明式事务注解 事务传播级别为默认 )

    calculateAllByEaArea方法(有声明式事务注解 事务传播级别为默认 访问域为public)

    calculateAll方法调用calculateAllByEaArea方法

    calculateAllByEaArea方法事务不生效

    EaAreaStatisticsSvr.java

    calculateAll方法(有声明式事务注解 事务传播级别为默认 )

    calculateAllByEaArea方法(有声明式事务注解 事务传播级别为propagation = Propagation.REQUIRES_NEW 访问域为public)

    calculateAll方法调用calculateAllByEaArea方法

    calculateAllByEaArea方法事务不生效

    EaAreaStatisticsSvr.java

    calculateAll方法(有声明式事务注解 事务传播级别为默认 )

    calculateAllByEaArea方法(有声明式事务注解 事务传播级别为propagation = Propagation.REQUIRES_NEW 访问域为public)

    calculateAll方法调用 eaAreaStatisticsSvr.calculateAllByEaArea方法 (@Autowired EaAreaStatisticsSvr eaAreaStatisticsSvr; 自己调用自己)

    calculateAllByEaArea方法事务生效

    原理分析

    public class A{
     
        @Transactional 
        public void a(){
        	b()
        }
        
        @Transactional 
        public void b(){
        	throw new Exception("rollback);
        }
        
    }
                                
                                
    public class A$Proxy{
        
        //A.a()中调用的b方法其实是A类中的b()方法,而不是A$Proxy代理类中的bProxy()方法  所以A.b()是没有事务控制的
        public void aProxy(){
            开启事务
            A.a() 
        }
        
        public void bProxy(){
        	开启事务
            A.b() 
        }
        
    }                            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    结论

    原理是Spring的动态代理

    解决方法

    public class A{
        //自己注入自己
        @Autowired A proxy
     
        @Transactional 
        public void a(){
        	proxy.b() //此时调用的是A$Proxy中的bProxy() b方法就有了事务控制
        }
        
        @Transactional 
        public void b(){
        	throw new Exception("rollback);
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    测试用例和自动化测试脚本也可以像代码一样复用
    安卓循环遍历计时器
    Eclipse 是如何导入web项目的
    Netty深入浅出(无处不在的IO)
    提升应用性能:Go中的同步与异步处理
    计算机毕业设计SSM仓库物资信息可视化管理系统【附源码数据库】
    小鱼ROS
    Javasript中的BOM
    C盘扩容好帮手——傲梅分区助手
    嵌入式IDE(1):IAR中ICF链接文件详解和实例分析
  • 原文地址:https://blog.csdn.net/qq_34486648/article/details/128116134