hibernate的锁

来源:互联网 发布:软件服务协议书范本 编辑:程序博客网 时间:2024/05/29 11:53

一,悲观锁:

悲观锁就是说当一个用户在访问数据库中的一条记录的时候,其他的所有人都不能访问,知道事务被提交为止,悲观锁的实现需要借助于数据库;

悲观锁实际上就是使用sql语句来跟记录加锁的

//悲观锁不支持lazy,下面的load会马上出现sql语句,悲观锁是借助于数据库来实现的

Inventory inventory = (Inventory) session.load(Inventory.class,2, LockMode.UPGRADE);//锁的级别

要实现悲观锁,就只要在你访问的记录上面加个锁的类型:lockMode.UPDATE 或者其他的类型

缺点并发性不好,一次只能一个用户访问,其他的用户都不能访问,知道该用户提交

二,乐观锁

其实乐观锁不是一种锁,是一种数据冲突检测手段,乐观锁与悲观锁不同,并发性要比悲观锁好,一次可以很多人同时访问

乐观锁增加了一个字段version,通过这个version的值来判断哪个先提交,谁先提交就是更新谁的值,version就会加1,后面提交的用户就会认为已经过时,不能提交,报错,version这个字段不是由我们来维护的,是由hibernate来维护的

实现乐观锁:1,在pojo类中要增加一个字段version来标识

           2,在映射文件中的<class....>中 加个属性 optimistic-lock="version",通过版本机制来实现乐观锁

3,在<id>的后面加个<version name="pojo中的ver字段"/>

<!-- optimistic里面可以有其他的值 -->

  <class name="Inventory" table="inventory" optimistic-lock="version">

        <id name="invId" column="inv_id">

            <generator class="native"/>

        </id>

              <!—

要实现Hibenate乐观锁,我们首先要在数据库表里增加一个版本控制字段,字段名随意,比如就叫version,对应hibernate类型只能为long,integer,short,timestamp,calendar,也就是只能为数字或timestamp类型

-->

     <version name="ver" column=”version” type=”Integer”/

<property name="invGoods" column="inv_goods"/>

<property name="storeNum" column="store_num"/>

</class>

0 0