似乎无法使隔离READ COMMITTED工作

时间:2012-01-02 13:10:13

标签: java hibernate

我正在使用hibernate和Spring来控制事务。

我目前有一个Object Foo ,我想在更新它之前从数据库中读取它。像这样的东西

@Transactional(isolation = Isolation.READ_COMMITTED)
public void update(Foo beingUpdated) {
   Foo beforeUpdate = fooDao.read(beingUpdated.getId());

   checkDifferences(beingUpdated, beforeUpdate);
   fooDao.update(beingUpdated);
}

但我的问题是当我读 Foo 时,返回的对象是正在更新的对象,而不是提交的对象。我误解了隔离的使用吗?如何读取在数据库中提交的对象,而不是正在更新的对象?

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

以下是一些选项:

  1. 在另一个会话中重新读取实体,可能使用注释为@Transactional(propgation=REQUIRES_NEW)的方法,该方法将为您提供该方法的新会话。这会增加数据库开销:您需要重新加载实体。
  2. 使用类似PostUpdateEvent.getOldState()的内容深入了解Hibernate内部。
  3. 使用LoadEventListener保存您感兴趣的州。如果您将信息放入瞬态字段,可以稍后访问它。
  4. 这些选项都不是很可口,但我在一些地方成功使用了1和3。