Hibernate Spring嵌套@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类,它有一个@Transactional方法,在同一个类上调用另一个@Transactional方法。我正在测试这个的回滚行为,我发现它不能正常工作。代码如下所示:

@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所描述的行为。