首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我在Spring @Transactional内部调用一个方法时,它不起作用。我怎么才能解决它呢?

在Spring中,@Transactional注解用于实现事务管理。当在@Transactional注解标记的方法内部调用另一个方法时,事务可能不会起作用的原因是因为Spring的事务机制是基于代理模式实现的。

解决这个问题的方法有两种:

  1. 将@Transactional注解放在类级别上:将@Transactional注解放在类级别上,而不是方法级别上。这样做可以确保整个类的所有方法都受到事务管理的影响。例如:
代码语言:txt
复制
@Transactional
public class MyClass {
    public void method1() {
        // ...
        method2();
        // ...
    }

    public void method2() {
        // ...
    }
}
  1. 通过AopProxyUtils.ultimateTargetClass方法获取目标类的实例:在方法内部调用另一个方法时,Spring可能会创建一个代理对象来管理事务。为了确保事务起作用,可以使用AopProxyUtils.ultimateTargetClass方法获取目标类的实例,并调用目标类的方法。例如:
代码语言:txt
复制
@Service
public class MyService {
    @Autowired
    private MyDao myDao;

    @Transactional
    public void method1() {
        // ...
        MyService target = AopProxyUtils.ultimateTargetClass(this);
        target.method2();
        // ...
    }

    public void method2() {
        // ...
    }
}

这样做可以绕过代理对象,直接调用目标类的方法,确保事务起作用。

以上是解决在Spring @Transactional内部调用方法时事务不起作用的两种方法。希望对你有帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券