我正在尝试编写一个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
答案 0 :(得分:0)
u.save(flush:true)
刷新Hibernate会话应该完成事务并释放数据库级别的锁。
答案 1 :(得分:0)
一般来说,pessimistick locking仅适用于transactional context。 因此,请确保将updateUser方法放在使用@Transactional注释的服务中。
调用get()然后lock()会导致执行2个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()
}
}