悲观锁定是否从休眠的第一级缓存中获取值

时间:2016-02-21 11:20:46

标签: hibernate grails

在接收外部服务请求时,会在多个会话上调用此方法。它的设置方式是它会锁定一个MyEntity行并立即提交。这样,我们希望它始终具有准确的值,并确保一次修改一行。

我们正在使用Grails,因此语法在Groovy中。

process() {
  list.each {
    MyEntity.withNewTransaction { //REQUIRES_NEW transaction propagation
      def myEntity = MyEntity.lock(list.getMyEntityId)
      //edit myEntity then save it
    }
  }
}

问题是,我们遇到过时的对象错误。它说实体已经被修改,尽管用悲观锁定获取它。我的猜测是实体正在hibernate的第一级缓存中获取。

在MyEntity上的每个悲观查询后立即添加刷新修复它。我的理解是这不应该是必要的,因为悲观锁定应该每次都对数据库执行“更新”,即使它已经在同一会话之前查询但是事务处理不同。这是对的吗?

是的,我正在使用Postgres Sql。并没有修改隔离级别。

0 个答案:

没有答案