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

默认的GORM类被配置为乐观锁。乐观锁实质上是Hibernate的一个特性,它在数据库里一个特别的 version 字段中保存了一个版本号.

version 列读取包含当前你所访问的持久化实例的版本状态的 version 属性:def airport = Airport.get(10) println airport.version当你执行更新操作时,Hibernate将自动检查version属性和数据库中version列,如果他们不同,将会抛出一个 StaleObjectException 异常,并且当前事物也会被回滚.

这是很有用的,因为它允许你不使用悲观锁(有一些性能上的损失)就可以获得一定的原子性。

由此带来的负面影响是,如果你有一些高并发的写操作的话,你必须处理这个异常。

这需要刷出(flushing)当前的session:def airport = Airport.get(10) try { airport.name = "Heathrow" airport.save(flush:true) } catch(org.springframework.dao.OptimisticLockingFailureException e) { // deal with exception }你处理异常的方法取决于你的应用. 你可以尝试合并数据,或者返回给用户并让他们来处理冲突.

作为选择,如果它成了问题,你可以求助于悲观锁.