我使用 hibernate 和 Spring 来控制事务。
我目前有一个对象Foo,我想在更新它之前从数据库中读取它。类似这样的事情
@Transactional(isolation = Isolation.READ_COMMITTED)
public void update(Foo beingUpdated) {
Foo beforeUpdate = fooDao.read(beingUpdated.getId());
checkDifferences(beingUpdated, beforeUpdate);
fooDao.update(beingUpdated);
}
但我的问题是,当我读取 Foo 时,返回的对象是正在更新的对象,而不是已提交的对象。我是否误解了隔离的使用?如何读取数据库中提交的对象,而不是正在更新的对象?
感谢任何帮助。
最佳答案
以下是一些供您选择的选项:
- 在另一个 session 中重新读取实体,可能使用带有
@Transactional(propgation=REQUIRES_NEW)
注释的方法,这将为您提供该方法的新 session 。但这会增加数据库开销:您将需要重新加载实体。 - 使用 PostUpdateEvent.getOldState() 等内容深入研究 Hibernate 内部结构.
- 通过 LoadEventListener 保存您感兴趣的状态。如果您将信息放入临时字段中,您可以稍后访问它。
这些选项都不是很令人满意,但我在一些地方成功地使用了 1 和 3。
关于java - 似乎无法使隔离 READ COMMITTED 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8701223/