测试情况
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);
}
}