@[TOC]Hibernate中的悲观锁和乐观锁
Hibernate中的悲观锁和乐观锁
用途:主要用来解决并发问题。锁是一种排他性的操作
悲观锁:对数据库的记录加锁,不支持懒加载.
实现策略:通常依赖于数据库机制,在整个过程中将数据锁定,其它任何用户都不能读取或修改,适合于短事物的操作.
加锁代码:
Inventory inv = (Inventory)session.load
(Inventory.class, 1, LockMode.UPGRADE);
//查询记录的时候顺便加了一个悲观锁
//由于悲观锁并不支持懒加载,所以一执行这个语句就会发送sql语句进行查询。
session.getTransaction().commit();// commit之后自动解锁
乐观锁:通过更改版本号来实现。并不算是真正的锁,支持懒加载
乐观锁的并发性比较好,但是处理事物的操作不是很好.
实现策略:
乐观锁的使用策略:大多数基于数据版本记录机制(version)实现,一般是在数据库表中加入一个version字段,读取数据时将版本号一同读出,之后更新数据时版本号加一,如果提交数据时版本号小于数据表中的版本号,则认为数据是过期的,否则给予更新。
看代码:
//实体类代码
public class Inventory {
private int itemNo;
private String itemName;
private int quantity;
private int version;
//这个属性一定要是整型,在hbm中定义由hibernate来控制。
//相应的hbm文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Inventory" table="t_inventory"
optimistic-lock="version">//表示乐观锁的版本号字段为version字段
<id name="itemNo">
<generator class="native"/>
</id>
<version name="version"/>//乐观锁字段
<property name="itemName"/>
<property name="quantity"/>
</class>
</hibernate-mapping>
使用:
Inventory inv = (Inventory)session.load(Inventory.class, 1);
直接使用即可,hibernate会自己根据版本号和id号加载对象,如果版本号中途被
修改了,就会出异常。支持懒加载。