`
IT_way
  • 浏览: 67707 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
有的人在想 “隔离级别” 不就是为了保证高并发数据安全性吗。既然有了这个为什么还有锁机制啊?隔离级别的安全控制是整体一个大的方面,而锁机制更加的灵活,它执行的粒度可以很小,可以在一个事务中存在。而且有了锁机制数据安全可谓是如虎添翼安全性更是大大的提高。
hibernate 提供了两种锁机制 乐观锁和悲观锁
乐观锁:在一个线程进行修改的时候,总不会出现另一个线程也在修改
悲观锁:一个线程存储的时候,总会有一个线程同时进行修改

有哪些锁类型
参考文献:http://gary0416.iteye.com/blog/888682

共享锁

加锁条件:当一个事务进行查询的时候,数据库就会给事务分配一个共享锁。锁定查询的数据,锁都是由数据库分配
解锁条件:数据查询完毕
兼容性:可以兼容更新锁
并发性能:并发性能高,多个事务读相同数据时,给每个事务分配一个共享锁


更新锁
加锁条件:当事务进行update更新时,将会获得一把更新锁
解锁条件:事务执行查询完毕,进行更新的时候,更行锁自动升级为独占锁
兼容性:可以兼容共享锁
并发性能:并发性能一般,因为升级为独占锁的时候,多个事务可以有共享锁,但只允许一个事务对数据进行更改,对数据进行锁定

独占锁
加锁条件:当事务进行,delete,update,insert操作时,将会得到独占锁
解锁条件:事务delete,update,insert操作完毕
兼容性:不能兼容共享锁和更型锁
并发性能:并发性能低,一次只允许一个事务对数据进行更改,锁定更新的内容,如果有多个事务,那其他的事务就得等待。

怎么实现乐观锁机制
hibernte 推荐是版本控制,在数据里增加一个字段,标识版本,字段值由数据库维护

实体类的映射文件


<hibernate-mapping>

    <class name="org.myhibernate.entity.TbStudent" table="tb_Student" catalog="hibernate_db" optimistic-lock="version" >
    	 
    	<!--  <cache usage="read-write"/>-->
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <!-- 版本控制 -->
       <version name="version" type="java.lang.Integer"></version>
</hibernate-mapping>




注意:<class  optimistic-lock="version">这个必须加上,只是告诉数据库启用版本控制,检查<version>/<timestamp>

non:不启用乐观锁
version:启用乐观锁机制的版本控制
dirty:更新时检查有更新的属性,达到乐观锁机制
all:检查所有属性,达到乐观锁机制(这个主要是你的项目没的源码的时候,你又想实现乐观锁,那你只有配置这个就行了,hibernate的开发人员想的听全面)


你不用版本控制,也可以改用时间戳

<timestamp name="timestamps"></timestamp>

当两个事务同时查询,得到相同的版本,其中的A一个事务更新了,此时数据的版本就改变了,B事在去更新 异常 StaleObjectStateException。数据库的版本和要更新的版本不一致。
在这里我对异常处理,让它重新更新,还是报这个错,我以为是缓存的原因干扰了,把缓存去掉,也还是报这个错,现在有点纠结,有知道的同志可以留言啊????代码在下面

public class TestVersion{
	private static Session  session=SessionFactoryUtil.getSession();
	private static TbStudent s1;
	private static TbStudent s2;
	static{
		
		s1=(TbStudent)session.get(TbStudent.class, 1);
		s2=(TbStudent) session.get(TbStudent.class, 1);
	}
	
	private static int i=0;
	public TestVersion(){};
	
	public static void main(String[] args) {
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try{
				session.beginTransaction();
				s1.setClassname(""+new Random().nextInt(1000));
				session.update(s1);
				session.beginTransaction().commit();
				}catch(StaleObjectStateException s){
					run();
				}
			}
		}).start();
		
		new Thread(new Runnable() {
					
					@Override
					public void run() {
						try{
						session.beginTransaction();
						int s=new Random().nextInt(1000);
						s2.setClassname(""+s);
						session.update(s2);
						session.beginTransaction().commit();
						
						}catch(StaleObjectStateException s){
							run();
						}
					}
				}).start();
			}
}



配置文件
<property name="hibernate.cache.use_second_level_cache">false</property>




乐观锁已经实现了,那么悲观锁怎么实现?


none:没有锁,查询的时候,先到缓存中去查,没有select数据库
read:查询的时候,到数据库去select,不到缓存
UPGRADE:升级锁,更行锁到独占锁,采用select for update,先拥有更新所,在查询数据的时候,更新的时候,资源锁定,变为独占锁。
UPGRADE_NOWAIT:升级锁不等到。当一个事务在更新的时候,已加锁,如果有其他的时候也想更新,那么事务结束。不在排队等候
WRITE :这个是hibernate自己内部使用的。我们不需要关心

怎么应用悲观锁

XX entity=session.get("entityname",id,LockMod)
entity=setxx();

我在使用悲观锁的时候
Lock wait timeout exceeded; try restarting transaction,
等待超时

我做了个实验,两个线程得到不是同一条数据,但同样会报上边那个异常,那么独占锁是行锁定,还是表锁定??这里有点疑问,如果是表锁定的话,那真的是并发性能真的很差
欢迎大家指正,和交流







  • 大小: 14.6 KB
分享到:
评论
1 楼 南朝落雨 2015-10-17  
您在使用悲观锁的时候是否走索引了呢?如果走索引才有可能实现行锁,否则就会出现表锁。

相关推荐

    Hibernate锁机制_悲观锁和乐观锁

    Hibernate锁机制_悲观锁和乐观锁

    hibernate乐观锁和悲观锁学习

    其中通过 version 实现的乐观锁机制是 Hibernate 官方推荐的乐观锁实现,同时也是 Hibernate 中,目前唯一在数据对象脱离 Session 发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择 version 方式...

    Hibernate框架 jar 架包 开发详解

    Hibernate 简介 Hibernate 开发流程 Hibernate 配置文件 Hibernate 核心接口和类 Hibernate ORM映射 HQL Hibernate 懒加载机制与抓取策略 Hibernate 缓存 Hibernate 锁机制

    Hibernate锁策略

    Hibernate锁的基本机制!主要是针对Hiberante乐观锁悲观锁的介绍以及相对应的数据库本身的处理机制,包括和SPRING相结合部分的锁处理机制

    hibernate乐观锁

    求助编辑百科名片相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销,特别是对长事务而言,...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    数据库事务、hibernate悲观锁和乐观锁

    NULL 博文链接:https://cdxs2.iteye.com/blog/1938245

    Hibernate实现悲观锁和乐观锁代码介绍

    主要介绍了Hibernate实现悲观锁和乐观锁的有关内容,涉及hibernate的隔离机制,以及实现悲观锁和乐观锁的代码实现,需要的朋友可以了解下。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制更新版本  21.6 实现乐观锁的其他方法  21.7 小结  21.8 思考题 第22章 管理...

    Hibernate注释大全收藏

    @Version 注解用于支持乐观锁版本控制。 @Entity public class Flight implements Serializable { ... @Version @Column(name="OPTLOCK") public Integer getVersion() { ... } } version属性映射到 "OPTLOCK...

    hibernate 2

    hibernate 2 中文介绍文档,比较全面,包括乐观锁的实现机制

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制更新版本  21.6 实现乐观锁的其他方法  21.7 小结  21.8 思考题 第22章 管理...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制更新版本  21.6 实现乐观锁的其他方法  21.7 小结  21.8 思考题 第22章 管理...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制更新版本  21.6 实现乐观锁的其他方法  21.7 小结  21.8 思考题 第22章 管理...

    Hibernate.lock()方法中各种锁的区别.docx

    假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实现。 基于jdbc实现的数据库加锁如下:。。。。...

    MySQL数据库锁机制原理解析

    在并发访问情况下,很有可能出现不可重复读等等读现象。为了更好的应对高并发,封锁...乐观锁和悲观锁不仅在关系数据库里应用,在Hibernate、Memcache等等也有相关概念。 悲观锁:也即悲观并发控制,Pessimistic Concur

    java面试资料

    精选JavaWeb面试题,包括线程池,jvm,spring框架,mybaits框架,hibernate框架,各种锁机制,zookeeper,redis,session机制等

    涵盖了90%以上的面试题

    为什么要加入锁机制 如何确定是否应该上锁?即如何判断是否有线程安全问题 什么是markword 乐观锁和悲观锁 偏向锁 轻量级锁 自旋锁 自适应自旋锁 重量级锁 synchronized 可重入锁 土方法实现可重入锁 使用AQS类实现可...

    低清版 大型门户网站是这样炼成的.pdf

    4.3 hibernate的映射机制 212 4.3.1 hibernate的基本映射数据类型 212 4.3.2 hibernate的主键映射 218 4.3.3 hibernate的实体映射 228 4.3.4 映射一对一关联关系 228 4.3.5 映射多对一单向关联关系 235 4.3.6 ...

Global site tag (gtag.js) - Google Analytics