是否可以在Spring中从非事务方法调用事务方法?

时间:2015-06-16 13:22:18

标签: java spring

假设我有一个Repository类。

@Repository
class MyRepository {

    @Transactional
    void method1 () {
        // some logic here
    }

    void method2 () {
        // some logic here
        method1();
        // some logic here
    }
}

是否可以在String中执行此操作?这是如何工作的?

4 个答案:

答案 0 :(得分:5)

这不起作用,因为这是自我调用。见
Spring @Transaction method call by the method within the same class, does not work?

根据您的应用程序及其职责,您可以为method2()创建另一个bean。 除此之外,DAO方法通常不应注释@Transactional。见
Where does the @Transactional annotation belong?

答案 1 :(得分:1)

这将不起作用,因为当您调用@Transaction时,该方法将超出method2的范围。但是您可以通过以下方式应用骇客并使用method2中的this来调用method1

this.method2();

答案 2 :(得分:0)

你不能这样做,因为Spring包装将从另一个类(服务)调用的方法。如果你使用相同的类调用带注释的方法,Spring将无法执行任何操作,因为它无法包装它们。

答案 3 :(得分:0)

您应该使用自我注入从非Transactional方法中调用Transactional方法,因为在Spring中,由于AOP代理,您不能简单地从同一实例中调用@Transactional方法东西

@Repository
class MyRepository {

    @Autowired
    MyRepository selfTxMyRepository;

    @Transactional
    void method1 () {
        // some logic here
    }

    void method2 () {
        // some logic here
        selfTxMyRepository.method1();
        // some logic here
    }
}

在此处查看一些说明:https://vladmihalcea.com/the-open-session-in-view-anti-pattern/