我正在尝试编写一个Groovy/Grails 3函数来查找数据库对象,锁定它,然后保存它(自动释放锁)。
如果该函数被多次调用,它应该等到锁被释放,然后运行更新。我如何才能做到这一点呢?
def updateUser(String name) {
User u = User.get(1)
// if locked, wait until released somehow?
u.lock()
u.name = name
u.save()
}
updateUser('bob')
updateUser('fred') // sees lock from previous call, waits until released, then updates发布于 2017-01-13 23:12:42
u.save(flush:true)
刷新Hibernate会话应该会完成事务并在数据库级别释放锁。
发布于 2017-08-08 04:45:29
一般来说,pessimistick locking只能在transactional context中工作。因此,请确保将updateUser方法放入带有@Transactional注释的服务中。
调用get()和lock()会导致执行两个sql语句(一个用于获取对象,另一个用于锁定对象)。使用User.lock(),单个select ...而是发出for udpate查询。
@Transactional
class UserService {
def updateUser(String name) {
User u = User.lock(1) // blocks until lock is free
u.name = name
u.save()
}
}https://stackoverflow.com/questions/41623453
复制相似问题