悲观锁注重安全,乐观锁注重并发
记录锁、表锁、数据库锁
1、悲观锁
悲观锁会使load上的懒加载自动失效,直接发sql语句
没有加乐观锁会造成丢失更新
其模型如下:
2、乐观锁
乐观锁本质上不是锁,是一种冲突检测手段,其并发性好。
乐观锁的使用策略:
大多数基于数据版本记录机制(version)实现,一般是在数据库表中加入一个version字段,读取数据时将版本号一同读出,之后更新数据时版本号加一,如果提交数据时版本号小于数据表中的版本号,则认为数据是过期的,否则给予更新
乐观锁通过控制版本号控制冲突,其模型如下:
乐观锁的使用
在业务类中增加version 属性和相应的方法
参见:Inventory.java
public class Inventory {
private int itemNo;
private String itemName;
private int quantity;
private int version;
……
修改相应类的hbm文件
参见:Inventory.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Inventory" table="t_inventory" optimistic-lock="version">
<id name="itemNo">
<generator class="native"/>
</id>
<version name="version"/>
<property name="itemName"/>
<property name="quantity"/>
</class>
</hibernate-mapping>
加载数据
例:hibernate_optimistic_locking
该语句对lazy有效
Inventory inv = (Inventory)session.load(Inventory.class, 1);