7

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

4

1 回答 1

1

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

于 2011-11-09T21:00:54.907 回答