我有一个@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查询。但是,这不应该在当前交易中运行吗?
答案 0 :(得分:1)
当你调用这些方法时,你肯定是从bean工厂获得了“ervice”的实例,对吧? bean工厂需要设置一个代理,它围绕每个方法调用实现事务逻辑。我的印象只有在“局外人”通过代理调用方法时才有效,并且当一个方法调用另一个方法时,它不一定有效,因为该方法是在实现对象内直接调用而不是通过AOP代理。