Hibernate 的锁机制:
悲观锁(Pessimistic Locking):
悲观锁往往通过数据库机制来实现,适合于安全性要求高并发不高的系统,具有绝对的排它性。在Hibernate中的方式较多,但是都是最终实现的结果就是在组装后的SQL语句的尾部追加“for update”或者“for update nowait(oracle数据库特有)”。注意:只有在查询开始之前(也就是Hiberate 生成SQL 之前)设定加锁,才会真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含for update子句的Select SQL加载进来,所谓数据库加锁也就无从谈起。
乐观锁(Optimistic Locking):
乐观锁通过Hibernate自身的机制来实现,适合于并发高的系统,可能通过其它的系统或者直接修改数据库破坏数据。有多种实现方式,其中官方推荐的是version,因为它是目前唯一数据对象脱离session发生改变的情况下依然有效的锁机制。通过在数据库中增加version字段,一般为Integer型,同时在hbm文件中增加以下“红色文字”的部分。通过在读取数据和提交修改时读取和比较version字段的值,来决定提交的数据是否是脏数据,是否将修改更新到数据库中。注意:version 节点必须出现在id节点之后。
<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version"
>
<id
name="id"
column="id"
type="java.lang.Integer"
>
<generator class="native">
</generator>
</id>
<version
column="version"
name="version"
type="java.lang.Integer"
/>
……
</class>
</hibernate-mapping>