您的位置:首页 > 其它

hibernate悲观锁和乐观锁

2013-05-21 18:04 183 查看
悲观锁定:假定在任何时刻存取数据时,都可能有一个客户也正在存取同一笔数据,因而对数据采取了数据库层次的锁定状态,在锁定的时间内其他的客户不能对资料进行存取。

乐观锁定:认为当前事务操作数据库资源时,很少或者不会有其他事务访问该数据资源,因此不能用数据级别上的锁定,完全依靠数据库的隔离级别来自动管理锁的工作。

对应用程序采取版本控制手段来避免可能出现的并发问题。

hibernate锁定模式

org.hibernate包下有一个名为 LockMode 的类,该类包含hibernate的主要锁定模式。

LockMode.NONE:默认的锁定模式

LockMode.READ

LockMode.UPGRADE

LockMode.UPGRADE_NOWAIT

LockMode.FORCE

悲观锁

显示设定锁定模式来设置悲观锁定,设置悲观锁定几种方式如下:

(1)调用Session.load()

Session session = getSession();
		Student student = (Student)session.load(Student.class, 6,LockMode.NONE);
(2)调用Session.lock()

Session session = getSession();
		Student student = (Student)session.load(Student.class, 6);
		session.lock(student, LockMode.UPGRADE);


(3)调用Query.setLockMode()

Query query = getSession().createQuery("from Student student");
        query.setLockMode("student", LockMode.NONE);
        query.list();


乐观锁

在hibernate中,主要由hibernate提供的版本控制功能来实现乐观锁定。

对象关系的映射文件中的<version>和<timestamp>具有版本控制功能。

<version>:利用一个递增的整数来跟踪数据库表中记录的版本

<timestamp>:利用时间戳来跟踪数据库中记录的版本

version:后提交的无法提交

timestamp:更新的时间和数据库里面的时间相比,数据库里的时间比较新,则无法提交

在映射文件中添加如下字段(举例)

<version name="ver" type="java.lang.Integer">
           <colomn name="ver" not-null="true"/>
        </version>
注意:在应用程序中,不需要为version属性赋值,在持久化类对象时,Hibernate会自动为其赋初值0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: