Grails 1.1 悲观锁和乐观锁 - 悲观锁

悲观锁等价于执行一个 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 }