gpt4 book ai didi

grails - 锁定Grails无法正常工作

转载 作者:行者123 更新时间:2023-12-02 14:37:44 25 4
gpt4 key购买 nike

使用Grails中的锁时,我遇到一些问题。

情况如下:

我有一个User类,然后是另一个具有belognsTo = User属性的类UserProperty。

现在,为了避免用户同时修改此属性,我想锁定用户,然后修改/添加/删除新属性。

但是锁似乎不起作用,因为在两种情况下,请求都经过低谷。伪代码如下所示:

User.lock(userId)
log.info "Starting modifiying properties"
addRemoveOrChangePropertiesToUser(userId)
log.info "Finsih modifing properties"
User.save(flush: true)

我期望的行为是,第一个请求通过并记录了所有内容。直到那之后(因为用户被锁定),第二个请求才等待,然后对属性进行更改。

基于日志文件,我看到了完全不同的行为。这两个请求的处理都没有任何等待时间(同时进行almos)。

你有什么主意,我在做什么错?我是否误解了一些与数据库锁定有关的概念?如何实现所需的行为?

谢谢,
尼古拉斯

最佳答案

我只是遇到了类似的问题,我的功能在 Controller 中。我以为一旦打到.lock语句,其他线程就应该被阻止,但是那没有发生。将整个事务包装在事务中为我解决了问题。

所以像这样:

User.withTransaction {
User.lock(userId)
log.info "Starting modifiying properties"
addRemoveOrChangePropertiesToUser(userId)
log.info "Finsih modifing properties"
User.save()
}

事后看来,我猜这是有道理的。我怀疑事务需要提供明确的分界(工作单元),否则GORM /休眠状态如何知道何时可以释放锁?

Controller 方法具有打开的 session ,但未包装在事务中。服务方法默认情况下包装在事务中,我怀疑我们在那里不会看到此问题。

关于grails - 锁定Grails无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6522266/

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