等待Grails事务中的锁定释放

时间:2017-01-12 21:39:30

标签: spring grails groovy

我正在尝试编写一个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

2 个答案:

答案 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()
    }
}