悲观锁定是否从hibernate一级缓存中获取值

悲观锁定是否从hibernate一级缓存中获取值,hibernate,grails,Hibernate,Grails,当接收到外部服务的请求时,在多个会话上调用此方法。它的设置方式是每次锁定一个MyEntity行并立即提交。这样,我们希望它始终具有准确的值,并确保一次修改一行 我们使用的是Grails,因此语法是Groovy process() { list.each { MyEntity.withNewTransaction { //REQUIRES_NEW transaction propagation def myEntity = MyEntity.lock(list.getMyE

当接收到外部服务的请求时,在多个会话上调用此方法。它的设置方式是每次锁定一个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上的每个悲观查询之后添加一个刷新将修复它。我的理解是,这不应该是必要的,因为悲观锁定应该每次都对数据库进行“for update”,即使它之前已经在同一个会话但不同的事务中被查询过。对吗


顺便说一句,我使用的是PostgresSQL。并且没有修改隔离级别。

一级缓存是会话绑定的,因此,如果您完全确定代码没有共享会话,那么一级缓存将不是原因。@Naros只是确认,如果我使用的是一个会话,并在单独的事务上通过悲观锁获取实体,一级缓存仍将用于后续查询?