我有一个@Service类,其中有一个@Transactional方法,该方法调用同一类中的另一个@Transactional方法。我正在测试它的回滚行为,并发现它无法正常工作。代码大致如下:
运行methodOne后,我检查了数据库,发现更改已经生效,尽管日志显示“JDBCTransaction - rollback”。
如果我单独调用methodTwo并在结尾处添加异常,则更改会正确地回滚。
有没有办法使methodOne正确回滚在嵌套的@Transactional调用期间发生的更改? 我认为REQUIRED的默认传播应该可以实现这一点,但似乎并没有起作用。谢谢
更新
好吧,我刚刚注意到另一件事。 在抛出异常之前,我正在调用服务的DAO并通过“executeUpdate”执行手动更新。 如果我注释掉这一行,则嵌套的回滚有效。 因此,问题实际上是调用DAO并运行executeUpdate查询。 但是这不应该在当前事务内运行吗?
@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查询。 但是这不应该在当前事务内运行吗?
methodOne()
调用methodTwo()
时,前者上的@Transactional
注解会被忽略?请参阅我的文章以获取更多详细信息。然而,这并不会导致你的问题,但了解这一点仍然很有价值。 - Tomasz Nurkiewicz