Spring嵌套了@Transactional方法和回滚

时间:2011-11-09 20:48:29

标签: hibernate spring service rollback transactional

我有一个@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查询。但是,这不应该在当前交易中运行吗?

1 个答案:

答案 0 :(得分:1)

当你调用这些方法时,你肯定是从bean工厂获得了“ervice”的实例,对吧? bean工厂需要设置一个代理,它围绕每个方法调用实现事务逻辑。我的印象只有在“局外人”通过代理调用方法时才有效,并且当一个方法调用另一个方法时,它不一定有效,因为该方法是在实现对象内直接调用而不是通过AOP代理。