悲观锁等价于执行一个 SQL “SELECT * FOR UPDATE” 语句并锁定数据库中的一行.
这意味着其他的读操作将会被锁定直到这个锁放开.
在Grails中悲观锁通过 lock 方法执行:def airport = Airport.get(10)
airport.lock() // lock for update
airport.name = "Heathrow"
airport.save()
一旦当前事物被提交,Grails会自动的为你释放锁. 可是,在上述情况下我们做的事情是从正规的SELECT“升级”到SELECT …FOR UPDATE同时其它线程也会在调用get()和lock()之间更新记录。
为了避免这个问题,你可以使用静态的lock 方法,就像get方法一样传入一个id:def airport = Airport.lock(10) // lock for update
airport.name = "Heathrow"
airport.save()
这个只有 SELECT…FOR UPDATE 时候可以使用.
尽管Grails和Hibernate支持悲观所,但是在使用Grails内置默认的 HSQLDB数据库时不支持。
如果你想测试悲观锁,你需要一个支持悲观锁的数据库,例如MySQL.
你也可以使用lock 方法在查询中获得悲观锁。
例如使用动态查询:def airport = Airport.findByName("Heathrow", [lock:true])
或者使用criteria:def airport = Airport.createCriteria().get {
eq('name', 'Heathrow')
lock true
}