Spring嵌套了@Transactional方法和回滚

Jay*_*Pea 7 service spring hibernate transactional rollback

我有一个@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
    }
}
Run Code Online (Sandbox Code Playgroud)

运行methodOne之后,我检查数据库并且存在更改,即使日志显示"JDBCTransaction - rollback".

如果我单独调用methodTwo并在其末尾添加异常,则会正确回滚更改.

有没有办法让methodOne正确回滚在嵌套的@Transactional调用期间发生的更改?我的印象是REQUIRED的默认传播会实现这一点,但它似乎没有起作用.谢谢

UPDATE

好的,我刚注意到别的东西.在异常抛出之前,我正在调用服务的dao并通过'executeUpdate'执行手动更新.如果我对此行进行注释,则嵌套回滚会起作用.所以似乎问题实际上是调用DAO并运行executeUpdate查询.但是,这不应该在当前交易中运行吗?

dma*_*eld 1

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