Hibernate的加锁模式有: Ø LockMode.NONE : 无锁机制。 Ø LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动 获取。 Ø LockMode.READ : Hibernate在读取记录的时候会自动获取。 以上这三种锁机制一般由Hibernate内部使用,如Hibernate为了保证Update 过程中对象不会被外界修改,会在save方法实现中自动为目标对象加上WRITE锁。 Ø LockMode.UPGRADE :利用数据库的for update子句加锁。 Ø LockMode. UPGRADE_NOWAIT :Oracle的特定实现,利用Oracle的for update nowait子句实现加锁。 上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现: Criteria.setLockMode Query.setLockMode Session.lock 注意,只有在查询开始之前(也就是Hiberate 生成SQL 之前)设定加锁,才会 真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含for update 子句的Select SQL加载进来,所谓数据库加锁也就无从谈起。
Hibernate 在其数据访问引擎中内置了乐观锁实现。如果不用考虑外部系统对数 据库的更新操作,利用Hibernate提供的透明化乐观锁实现,将大大提升我们的 生产力。 Hibernate中可以通过class描述符的optimistic-lock属性结合version 描述符指定。 现在,我们为之前示例中的TUser加上乐观锁机制。 Hibernate Developer’s Guide Version 1.0 September 2, 2004 So many open source projects. Why not Open your Documents? 1. 首先为TUser的class描述符添加optimistic-lock属性:
name="org.hibernate.sample.TUser" table="t_user" dynamic-update="true" dynamic-insert="true" optimistic-lock="version" > ……
optimistic-lock属性有如下可选取值: Ø none 无乐观锁 Ø version 通过版本机制实现乐观锁 Ø dirty 通过检查发生变动过的属性实现乐观锁 Ø all 通过检查所有属性实现乐观锁 其中通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,同时也 是Hibernate中,目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机 制。因此,一般情况下,我们都选择version方式作为Hibernate乐观锁实现机制。 
|