gpt4 book ai didi

hibernate - 我如何知道 Grails 模型自检索后是否已更改?

转载 作者:行者123 更新时间:2023-12-02 22:25:46 27 4
gpt4 key购买 nike

我希望多个用户能够同时在网络浏览器中编辑模型,并在保存时检测到冲突(以便第一个写入的用户不会在没有第二个用户明确说明的情况下覆盖其更改) 。示例如下:

用户 A 检索对象 X 并正在其浏览器中查看它。

然后,用户 B 检索对象 X,在浏览器中查看它,修改它,然后保存它,从而导致向 Grails 中的 REST api 进行发布,并将模型保存到数据库中。

然后用户A修改并保存该对象。

我希望应用程序检测到对象 X 自用户 A 检索以来已被修改,并且我将向用户 A 显示一 strip 有一些选项的合适消息。

我如何知道模型是否已更改?请注意,isDirty 将不起作用,save(flush:true) 将不起作用。

更新

我看到几个关于乐观锁定和检测模型更改(自提交以来)的答案。我想检测更改,因为它是由用户检索的。请再次阅读问题。

这里我会澄清为什么乐观锁不能解决上述问题。但是,我可以想象我可能有一种方法可以使用乐观锁定,但正如下面的答案中所描述的以及文档中所描述的那样,它不会有帮助。这就是原因。

乐观锁定在请求内起作用,而不是跨请求起作用。如果第二个用户在第一个用户发出更新请求时更新对象,则乐观锁定将只允许一个用户执行更新。乐观锁定可防止读取-修改-写入与同一请求中的另一个读取-修改-写入交错。以下是乐观锁定所防止的事件的时间线(其中时间从上到下):

User 1                          User 2
presses submit presses submit
in update action
| read model
| in update action
| | read model
| | modify model
| | write model
| return
| modify model
| write model - FAILS
return error or something

第一个用户帖子写入模型失败,因为乐观锁定检查检测到记录自读取以来已被修改。

我想要防止的是以下时间表:

User 1                          User 2
visits web app visits web app
clicks link to edit model clicks link to edit model
in edit action
| read model
| render model
return
in edit action
| read model
| render model
return
user edits model user edits model
user thinks... hmm... user submits
in update action
| read model
| modify model from params
| write model
return
user submits
in update action
| read model
| modify model from params
| write model - OOPS! overwrote previous changes
return

从此示例中您可以看到用户 1 覆盖了用户 2 的更改。但是用户 1 是根据数据库中模型的旧副本进行更改的,如果她在思考时看到用户 2 所做的更改,也许她会做一些不同的事情。

最佳答案

正如 dmahapatro 所说,乐观锁定是内置的。我只想补充一点,Grails 脚手架在 Controller 的更新操作中考虑了这一点。例如,请注意,它会检查版本以查看 Book 自提交以来是否已更新。

def update(Long id, Long version) {
def bookInstance = Book.get(id)
if (!bookInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), id])
redirect(action: "list")
return
}

if (version != null) {
if (bookInstance.version > version) {
bookInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
[message(code: 'book.label', default: 'Book')] as Object[],
"Another user has updated this Book while you were editing")
render(view: "edit", model: [bookInstance: bookInstance])
return
}
}

bookInstance.properties = params

if (!bookInstance.save(flush: true)) {
render(view: "edit", model: [bookInstance: bookInstance])
return
}

flash.message = message(code: 'default.updated.message', args: [message(code: 'book.label', default: 'Book'), bookInstance.id])
redirect(action: "show", id: bookInstance.id)
}

关于hibernate - 我如何知道 Grails 模型自检索后是否已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18861891/

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