默认的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
}你处理异常的方法取决于你的应用. 你可以尝试合并数据,或者返回给用户并让他们来处理冲突.
作为选择,如果它成了问题,你可以求助于悲观锁.