java - 似乎无法使隔离 READ COMMITTED 工作

标签 java hibernate

我使用 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 时,返回的对象是正在更新的对象,而不是已提交的对象。我是否误解了隔离的使用?如何读取数据库中提交的对象,而不是正在更新的对象?

感谢任何帮助。

最佳答案

以下是一些供您选择的选项:

  1. 在另一个 session 中重新读取实体,可能使用带有 @Transactional(propgation=REQUIRES_NEW) 注释的方法,这将为您提供该方法的新 session 。但这会增加数据库开销:您将需要重新加载实体。
  2. 使用 PostUpdateEvent.getOldState() 等内容深入研究 Hibernate 内部结构.
  3. 通过 LoadEventListener 保存您感兴趣的状态。如果您将信息放入临时字段中,您可以稍后访问它。

这些选项都不是很令人满意,但我在一些地方成功地使用了 1 和 3。

关于java - 似乎无法使隔离 READ COMMITTED 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8701223/

相关文章:

java - hibernate返回列表转换问题

java - Spring Boot 1.5禁用oauth2安全

java - 如何找到 TypeMirror 的边界并将它们转换为 JavaPoet TypeSpec?

java - 如何动态地将外部定义的bean定义添加到Spring上下文中?

java - 从 StaleObjectStateException 中恢复

java - Spring + hibernate + JPA

java - 即使转换为字符串也无法从密码字段获取文本

Java Unix Shell 更改目录

java - 创建条件时 session 关闭

java - 在 Websphere 7 中使用 Hibernate 最新版本