嗨,使用Spring / JPA Hibernate面对一个更棘手的问题。

我在服务类methodA()methodB()中有两种方法

@Transactional
methodA(){
    for(){
        methodB();
    }

    some other database operations.
}

@Transactional
methodB(){
    database Update/Insert Operations.
    save();
}


如上所述,我在循环中从MethodA调用methodB。如果循环中的任何操作失败或循环外的数据库操作失败,则我希望转移到回滚,因为methodA()本身就是transactiona。

但是我遇到了一个更棘手的问题,我看到数据在methodB()完成后立即提交到数据库,即使从methodA()抛出异常后也不会回滚。

我还尝试从methodB()中删除​​翻译,也尝试了propogation = NESTED/REQUIRED/MANDATORY。但是似乎没有任何作用。

最佳答案

这不是使用Spring时事务的工作方式。必须从外部而不是在其他方法内部调用事务方法。原因是在您的情况下,Spring无法通过AOP代理应用事务,因为对methodB的调用直接来自methodA,而Spring无法在调用methodB之前应用事务方面。有关更多信息,请参见“了解AOP代理”一节中的here
here
在10.5.1节中

10-08 12:54