【发布时间】:2014-02-17 01:13:05
【问题描述】:
如果你在域实例或类上静态调用lock(),然后你决定对对象没有任何事情,有没有办法手动立即释放锁?
【问题讨论】:
-
它被锁定以进行更新,因此您可以在域对象上调用
save()来释放锁定,尽管它可能很昂贵。
标签: grails grails-orm grails-2.0
如果你在域实例或类上静态调用lock(),然后你决定对对象没有任何事情,有没有办法手动立即释放锁?
【问题讨论】:
save() 来释放锁定,尽管它可能很昂贵。
标签: grails grails-orm grails-2.0
为了扩展dmahapatro 所说的内容,docs 表示:
事务提交时自动释放锁
因此,一旦您调用.save(),当该保存的事务提交时(通常在服务结束方法时),锁将被释放。
您可能还想查看这些docs。
【讨论】:
在提交事务时释放锁,但在调用 save() 时不会释放,因为在 save() 之后事务仍然存在。当代码执行离开服务方法或刷新休眠会话(http请求完成后,会话被刷新并清除)时,事务可能会被提交。
释放锁的最佳方法是使用手动事务处理。在服务中这样做:
def saveUser(Long userId)
{
User.withNewTransaction { TransactionStatus status ->
User user = User.lock(userId)
user.save()
}
}
【讨论】: