Hibernate锁

悲观锁
从加载对象就开始锁定。修改过程中一直是锁。直到commit()提交后再解锁。

session.load(Info.class,"p003",LockOptions.UPGRADE);

实例:

public class TestPessimisticLock extends TestCase {
    @Test
    public void testLock1(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();//开始锁定,下面的testLock2不能执行
            session.beginTransaction();

            Info data = session.load(Info.class, "p003", LockOptions.UPGRADE);
            data.setName("1111111");

            session.getTransaction().commit();//执行以后才解锁,这时testLock2才可以执行
        }
        catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        finally{
            HibernateUtil.closeSession();
        }
    }
    @Test
    public void testLock2(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            session.beginTransaction();

            Info data = session.load(Info.class, "p003", LockOptions.UPGRADE);
            data.setName("2222222");

            session.getTransaction().commit();
        }
        catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        finally{
            HibernateUtil.closeSession();
        }
    }
}

乐观锁
实际不算锁,只是多线程控制。在提交时间进行冲突检测。把里面的内容与刚开始读取的内容对照一下。有问题就抛异常。

1.在数据库表中加一个字段version

2.在实体类中加一个属性version

public class Info implements java.io.Serializable {

    private String code;
    private Nation nation;
    private String name;
    private Boolean sex;
    private Date birthday;
    private Set families = new HashSet(0);
    private Set works = new HashSet(0);
    private int version;//添加一个属性version,并生成getter和setter

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

3.在映谢文件中配置<version name="version"> 位置 放在<id></id>下面

<hibernate-mapping>
    <class name="com.itnba.maya.model.Info" table="info" catalog="mydb" optimistic-lock="version">
        <cache usage="read-write"/>
        <id name="code" type="string">
            <column name="Code" length="50" />
            <generator class="assigned" />
        </id>

        <!-- 配置version,位置放在<id></id>下面 -->
        <version name="version"></version>

        <many-to-one name="nation" class="com.itnba.maya.model.Nation" fetch="select">
            <column name="Nation" length="50" />
        </many-to-one>
        <property name="name" type="string">
            <column name="Name" length="50" />
        </property>
        ....
 </class>
</hibernate-mapping>

其余代码不做改变。

实例:

public class TestOptimisticLock extends TestCase{
    @Test
    public void testLock2(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            session.beginTransaction();

            Info data = session.load(Info.class, "p002");
            data.setName("2222222");

            session.getTransaction().commit();//在此时进行冲突检测,version的值与刚开始读取的version值比较。值不同就就抛异常,意为无法操作。
        }
        catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        finally{
            HibernateUtil.closeSession();
        }
    }
    @Test
    public void testLock1(){
        Session session = null;
        try {
            session = HibernateUtil.getSession();
            session.beginTransaction();

            Info data = session.load(Info.class, "p002");
            data.setName("1111111");

            session.getTransaction().commit();
        }
        catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        finally{
            HibernateUtil.closeSession();
        }
    }
}

假如没有使用hibernate,那么这样来处理并发冲突 

Info oldInfo = ...

Info newInfo =...

//where前面的内容用newInfo的属性,where后面的内容用oldInfo的属性
update info set name=?,sex=?,nation=?,birthday=? where code=? and name=? and sex=? and nation=? and birthday=?

executeUpdate(); //返回值为int,如果出现冲突,提示-更新的行数0----表示有并发冲突
时间: 2025-01-06 00:56:04

Hibernate锁的相关文章

Hibernate锁机制

业务逻辑的实现过程中,往往需要保证数据访问的排他性.因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法被其它程序修改. Hibernate 支持两种锁机制: 1. 悲观锁(Pessimistic Locking): 2. 乐观锁(Optimistic Locking): 1.悲观锁 它指的是对数据被外界修改持保守态度.假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操

千山万水之Hibernate(十三)——锁

锁主要是为了解决数据的并发访问问题.悲观锁,通常是由数据库机制实现,在整个过程中把数据锁住(查询时),只要事务不释放,任何用户都不能查看或修改.Hibernate中对悲观锁进行了封装. 测试示例 悲观锁 同时执行两个测试方法,同时采用悲观锁方式访问同一条数据记录. 1.建立测试实体 package com.tgb.hibernate; /** * 库存实体 * @author Forrest * */ public class Inventory { //物料编码 private String

【Hibernate步步为营】--锁机制详解

上篇文章详细讨论了hql的各种查询方法,在讨论过程中写了代码示例,hql的查询方法类似于sql,查询的方法比较简单,有sql基础的开发人员在使用hql时就会变得相当的简单.Hibernate在操作数据库的同时也提供了对数据库操作的限制方法,这种方法被称为锁机制,Hibernate提供的锁分为两种一种是乐观锁,另外一种是悲观锁.通过使用锁能够控制数据库的并发性操作,限制用户对数据库的并发性的操作. 一.锁简介 锁能控制数据库的并发操作,通过使用锁来控制数据库的并发操作,Hibernate提供了两种

Hibernate逍遥游记-第15章处理并发问题-003乐观锁

1. 2. 1 drop database if exists SAMPLEDB; 2 create database SAMPLEDB; 3 use SAMPLEDB; 4 5 drop table if exists MONKEYS ; 6 create table MONKEYS( 7 ID bigint not null, 8 NAME varchar(15), 9 COUNT int, 10 VERSION integer, 11 primary key (ID) 12 ) type=

Hibernate(五)——面向对象查询语言和锁

Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了.但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hibernate  Query  Language)面向对象的查询语言,和QBC(Query by Criteria)完全面向对象的查询,这里简单总结一下如何是面向对象来编写ql语句呢.  一,HQL,Hibernate框架中的查询语言,是一种面向对象查询语言,和sql语句还是非常类似的,就是将sql

Hibernate中的锁机制

锁机制:是数据库为了保证数据的一致性<一个事务的各种操作不相互影响>而使各种共享资源在被并发访问访问变得有序所设计的一种规则,用来保证在当前用户进行操作数据的时候其他的用户不能对同一数据进行任何操作. Hibernate是一个持久层框架,他的操作就是用来存取数据库中的数据,为了保证数据的一致性,hibernate提供了自己的锁机制. Hibernate的锁机制: 乐观锁:<pessimistic locking>他认为一般不会出现多个用户同时操作同一条数据的情况,因此不做资料库层次

Hibernate学习---第十二节:Hibernate之锁机制&amp;乐观锁实现

1.悲观锁 它指的是对数据被外界修改保持保守态度,因些,在整个数据处理过程中,将数据牌锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层的锁机制才能保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据). 一个典型的悲观锁调用示例: select * from account where name = "12345" for update 通过for update子句,这条SQL锁定了account表中所有符合检索条件的记录.本次事务

【Hibernate步步为营】--锁机制具体解释

上篇文章具体讨论了hql的各种查询方法.在讨论过程中写了代码演示样例.hql的查询方法类似于sql,查询的方法比較简单,有sql基础的开发者在使用hql时就会变得相当的简单. Hibernate在操作数据库的同一时候也提供了对数据库操作的限制方法.这样的方法被称为锁机制,Hibernate提供的锁分为两种一种是乐观锁.第二种是悲观锁. 通过使用锁可以控制数据库的并发性操作.限制用户对数据库的并发性的操作. 一.锁简单介绍 锁能控制数据库的并发操作,通过使用锁来控制数据库的并发操作,Hiberna

Hibernate 悲观锁,乐观锁

业务逻辑的实现过程中,往往需要保证数据访问的排他性.因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的"锁",即给我们选定的目标数据上锁,使其无法被其它程序修改. Hibernate 支持两种锁机制: 1. 悲观锁(Pessimistic Locking) 从加载对象就开始锁定.修改过程中一直是锁.直到事务commit()提交后再解锁. session.load(Info.class,"p003",LockOp