gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:39:04 24 4
gpt4 key购买 nike

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

更新:

是的,hibernate会在保存对象时检查版本,并在乐观锁定失败时抛出异常。我猜休眠会确保检查+更新是原子的,但是......

如果您看一下 grails 生成的更新方法,您会发现 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

并在更新失败时抛出异常(顺便说一句,目前很难从这个错误中恢复,大多数情况下你只是丢失了更新)。

如果您想确保保存数据,请尝试强制保存数据(并检查保存/验证错误):

try {
if (!obj.save(flush: true)) {
// validation error
}
} catch (OptimisticLockingFailureException e) {
// not saved
}

甚至在更新之前锁定数据。仅当您有大量并发更新时它才有用。

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

有关 GORM 锁定的更多详细信息,请访问 http://grails.org/doc/latest/guide/GORM.html#locking

关于Grails:什么可以确保版本检查和更新是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10704011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com