• @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
  • 相关阅读:
    原生Hadoop3.X高可用配置方式
    mysql 自定义函数 身份证号转年龄(支持15/18位身份证)
    “企业级零代码黑客马拉松”决赛圆满落幕
    面向面试知识-消息队列
    局域网内root 权限连接mysql数据库
    java基础巩固20
    【LeetCode】图文+实例弄清KMP算法
    1018 Public Bike Management (动规暴力美学)
    《Python+Kivy(App开发)从入门到实践》自学笔记:高级UX部件——DropDown下拉列表
    ECS框架浅析
  • 原文地址:https://blog.csdn.net/qq_34486648/article/details/128116134