Hibernate Spring嵌套@Transactional方法和回滚
我有一个@Service类,它有一个@Transactional方法,在同一个类上调用另一个@Transactional方法。我正在测试这个的回滚行为,我发现它不能正常工作。代码如下所示:Hibernate Spring嵌套@Transactional方法和回滚,hibernate,spring,service,rollback,transactional,Hibernate,Spring,Service,Rollback,Transactional,我有一个@Service类,它有一个@Transactional方法,在同一个类上调用另一个@Transactional方法。我正在测试这个的回滚行为,我发现它不能正常工作。代码如下所示: @Service public class DefaulService implements ervice { @Transactional public void methodOne() { methodTwo(); //question e
@Service
public class DefaulService implements ervice
{
@Transactional
public void methodOne()
{
methodTwo();
//question edited
//this seems to be the problem
this.serviceDAO.executeUpdateOperation();
//test rollback
throw new RuntimeException();
}
@Transactional
public void methodTwo()
{
//DAO stuff
}
}
在运行methodOne之后,我检查数据库,发现有更改,即使日志显示“JDBCTransaction-rollback”
如果我单独调用methodTwo并在其末尾添加一个异常,那么更改将正确回滚
有没有办法使methodOne正确回滚嵌套@Transactional调用期间发生的更改?我的印象是,REQUIRED的默认传播可以实现这一点,但它似乎不起作用。谢谢
更新
好吧,我只是注意到了一些别的东西。在抛出异常之前,我正在调用服务的dao并通过“executeUpdate”执行手动更新。如果我对这一行进行注释,则嵌套回滚可以工作。因此,问题似乎实际上是调用DAO并运行executeUpdate查询。但是这不应该也在当前事务中运行吗?当您调用这些方法时,您肯定是从bean工厂获得了“服务”的实例,对吗?bean工厂需要设置一个代理,该代理围绕每个方法调用实现事务逻辑。我的印象是,这只在“局外人”通过代理调用方法时起作用,而在一个方法调用另一个方法时不一定起作用,因为该方法是实现对象内部的直接调用,不通过AOP代理进行调用。当从
methodOne()调用methodTwo()
时,您知道吗
@Transactional
忽略前一个注释?有关更多详细信息,请参阅我的。然而,这并没有引起您的问题,但值得知道。是的,但是由于MethodTwo可以独立调用,因此对于这种情况,它需要自己的注释。现在我很困惑,为什么executeUpdate会导致提交事务,尽管这可能是默认行为。serviceDao的事务传播是什么?这是否需要新的方法?这取决于您使用的是哪种AOP方法。检查Tomasz Nurkiewicz的报告。这也不能解释JayPea所描述的行为。