@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() 
    }
    
}                            

结论

原理是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);
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值