嗨,使用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节中