1.在同一个类中一个没有事务 A 的方法调用另个有事务 B 的方法,那么那个有事务 B 的方法是失效的;
public class test {
public void a() {
this.b();
}
@Transactional
public void b() {
/* … */
}
}
2.如果有事务 A 方法调用没有(或者有)事务 B 的方法,那么事务 A 都会生效,而方法 B 不会生效;
public class test {
@Transactional
public void a() {
this.b();
}
@Transactional
// @Transactional
public void b() {
/* … */
}
}
3.但是如果是不同类的话就都会生效;
总结
我们调用的方法A不带注解,因此代理类不开事务,而是直接调用目标对象的方法。当进入目标对象的方法后,执行的上下文已经变成目标对象本身了,因为目标对象的代码是我们自己写的,和事务没有半毛钱关系,此时你再调用带注解的方法,照样没有事务,只是一个普通的方法调用而已。简单来说,内部调用本类方法,不会再走代理了,所以B的事务不起作用。
解决方案:
- 可以将方法放入另一个类,并且该类通过spring注入,即符合了在对象之间调用的条件。
- 获取本对象的代理对象,再进行调用。具体操作如:
1)Spring-content.xml上下文中,增加配置:
2)在xxxServiceImpl中,用(xxxService)(AopContext.currentProxy()),获取到xxxService的代理类,再调用事务方法,强行经过代理类,激活事务切面。
public class test {
@Transactional
public void a() {
(test)(AopContext.currentProxy()).b();
}
@Transactional
public void b() {
/* … */
}
}
- 当然也可以@Autowired 注入自己来调用方法解决。
- 把注解加到类名上面。
标签:事务,调用,Transactional,void,失效,方法,public,类中 From: https://blog.51cto.com/u_16111396/6392690