在接收外部服务请求时,会在多个会话上调用此方法。它的设置方式是它会锁定一个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。并没有修改隔离级别。