【引用】http://www.tongyi.net/develop/Java/1025649.html
Hibernate的加锁模式有:
Ø LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动获取。
这种锁机制一般由Hibernate内部使用,如Hibernate为了保证Update过程中对象不会被外界修改,会在save方法实现中自动为目标对象加上WRITE锁。
Ø LockMode.NONE : 无锁机制。
Ø LockMode.READ : Hibernate在读取记录的时候会自动获取。//select id from User where id =?
Ø LockMode.UPGRADE :利用数据库的for update子句加锁。//select id from User where id =? 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加上乐观锁机制。
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乐观锁实现机制。