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