Grails:什么确保版本检查和更新是原子的?

Grails:什么确保版本检查和更新是原子的?,grails,optimistic-locking,Grails,Optimistic Locking,Grails中的update操作首先检查要更新的对象的版本,然后更新它。 在检查版本和更新对象期间,Grails的哪一部分确保对象不会被另一个请求更新 更新: 是的,hibernate将在保存对象时检查版本,并在乐观锁定失败时引发异常。我想hibernate会确保检查+更新是原子的,但是 如果您查看一下grails生成的update方法,您会发现grails首先进行了双重检查,然后(在我看来)没有准备好处理异常。hibernate在更新方法检查了正确的版本后抛出异常的可能性很小,但在我看来这是可

Grails中的
update
操作首先检查要更新的对象的版本,然后更新它。 在检查版本和更新对象期间,Grails的哪一部分确保对象不会被另一个请求更新

更新:

是的,hibernate将在保存对象时检查版本,并在乐观锁定失败时引发异常。我想hibernate会确保检查+更新是原子的,但是

如果您查看一下grails生成的update方法,您会发现grails首先进行了双重检查,然后(在我看来)没有准备好处理异常。hibernate在更新方法检查了正确的版本后抛出异常的可能性很小,但在我看来这是可能的


那么,尝试保存并捕获异常(如果存在异常)难道还不够吗?

它由Hibernate层管理。它被称为“乐观锁定”,基本上它只更新具有已知版本的对象。比如:

UPDATE SET
  %... fields ...%, 
  version = version + 1                      --update version to a new value
WHERE 
  id = %obj id%                              --current object
  AND version = %previous obj version%`      --last known version 
并在更新失败时抛出异常(顺便说一句,此时很难从错误中恢复,在大多数情况下,您只是丢失了更新)

如果要确保数据已保存,请尝试强制保存数据(并检查是否存在保存/有效错误):

甚至在更新之前锁定数据。只有当您有很多并发更新时,它才有用

MyDomain obj = MyDomain.lock(params.id) //now it's locked for update
// update fields
obj.save()

有关GORM锁定的更多详细信息,请参见

好问题,我猜在服务中是事务状态完成了锁定,但在控制器中,您必须手动检查。如果你用谷歌搜索的话,应该会有很多信息……嗯。正确的。所以我得到了一个异常,但是如果你看看grails生成的控制器代码。。。有关更多详细信息,请参阅我的更新。。。
MyDomain obj = MyDomain.lock(params.id) //now it's locked for update
// update fields
obj.save()