当前位置: 首页 > 图灵资讯 > 技术篇> 同一个类中@Transactional 事务失效

同一个类中@Transactional 事务失效

来源:图灵教育
时间:2023-06-11 09:17:38

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的事务不起作用。

解决方案:

  1. 方法可以放在另一个类中,通过spring注入,即符合对象之间调用的条件。
  2. 获取本对象的代理对象,然后调用。具体操作如下:

1)Spring-content.在xml上下文中,增加配置:

2)在xxxserviceimpl中使用(xxxService)(AopContext.currentProxy(),获得xxxservice的代理类,然后调用事务方法,强行通过代理类,激活事务截面。

public class test { @Transactional public void a() { (test)(AopContext.currentProxy()).b(); } @Transactional // @Transactional public void b() { /* … */ }}

  1. 当然也可以@Autowired 注入自己来调用解决方案。
  2. 将注释添加到类名中。