我已正确设置了@Transactional,但是使用以下方法返回“success”但该记录未从表中删除:
@Transactional
public void deleteLimXrefHvo(LimitXrefHvo limitXrefHvo){
getSession().delete(getTableId(limitXrefHvo));
}
我尝试使用@Transactional注释的方法getTableId,但这并没有解决问题。我也调用了getTableId并将返回值存储在一个变量中,然后将其传递给delete(),但这也没有用。
我尝试过的唯一有效的方法是添加getSession()。flush();删除事务后。如果我设置了@Transactional,那么我不需要在之后进行刷新。我错过了什么?
答案 0 :(得分:0)
会话的有效期可能超过一次。这似乎就是这种情况。来自JSR-220 5.6:
容器管理的持久化上下文可以定义为具有 限定为单个事务或扩展的生命周期 跨越多个事务的生命周期,具体取决于 在其EntityManager所指定的PersistenceContextType 创建。本规范将此类持久性上下文称为 事务范围的持久化上下文和扩展的持久性 上下文。
我知道你说'Spring'而不是Java EE容器,但我相信它归结为同样的行为。
这就是说会话范围不等于事务范围。对于您的具体问题,您可以查看:
@Transactional
方法调用'deleteLimXrefHvo()'(提示:事务传播怎么样)?调查您的日志,特别是我会在您的事务管理器上将日志记录级别设置为DEBUG
,以确切了解它正在执行的操作。
答案 1 :(得分:0)
导致问题的是getTableId。 getTableId调用它自己的getSession(),因此,我必须flush()。没有绕过它。但是有道理。