Hibernate乐观锁、悲观锁和多态

简介:    一、乐观锁和悲观锁     悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

 

 一、乐观锁和悲观锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
    乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
    两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
悲观锁:
String hqlStr =
"from TUser as user where user.name='Erica'";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); //加锁
List userList = query.list();//执行查询,获取数据

  

Hibernate的加锁模式有:
Ø LockMode.NONE : 无锁机制。
Ø LockMode.WRITE :Hibernate在Insert和Update记录的时候会自动获取。
Ø LockMode.READ : Hibernate在读取记录的时候会自动获取。
       ---以上这三种锁机制一般由Hibernate内部使用,如Hibernate为了保证Update 过程中对象不会被外界修改,会在save方法实现中自动为目标对象加上WRITE锁。
Ø LockMode.UPGRADE :利用数据库的for update子句加锁。
Ø LockMode. UPGRADE_NOWAIT :Oracle的特定实现,利用Oracle的for update nowait子句实现加锁。
              -- 上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock

二、多态

    第一种方案:一个子类对应一张表。
         实现方式:在父类的配置文件中配置子类的实现方式,当然,也可以在子类中单独配置
         <!-- 可单独写在Student.hbm.xml里 -->
         <union-subclassname="com.jomoo.entity.Student"table="student"extends="com.jomoo.entity.People">
                   <propertyname="studentNumber"column="studentNumber"type="string"></property>
         </union-subclass>
         <!-- 可单独写在Teacher.hbm.xml里 -->
         <union-subclass name="com.jomoo.entity.Teacher" table="teacher" extends="com.jomoo.entity.People">
                   <property name="salary" column="salary" type="string"></property>
         </union-subclass>

  

第二种方案:使用一张表表示所有继承体系下的类的属性的并集。
 
这种策略是使用<subclass>标签来实现的。因为类继承体系下会有许多个子类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。Hibernate中的这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。在表中添加这个标示列使用<discriminator>标签来实现。
 
第三种方案:每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。
 
每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。这种策略是使用<joined-subclass>标签来定义子类的。父类、子类都对应一张数据库表。在父类对应的数据库表中,它存储了所有记录的公共信息,实际上该父类对应的表会包含所有的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子类中所特有的属性映射的字段。子类对应的数据表与父类对应的数据表,通过一对一主键关联的方式关联起来。
 
目录
相关文章
|
8月前
|
算法
悲观锁和乐观锁的区别
悲观锁和乐观锁的区别
196 0
|
9月前
|
Java
JAVA 锁:乐观锁、悲观锁?
JAVA 锁:乐观锁、悲观锁?
37 0
|
9月前
|
XML 前端开发 Java
案例突破——悲观锁和乐观锁
案例突破——悲观锁和乐观锁
98 0
案例突破——悲观锁和乐观锁
|
9月前
|
数据库
乐观锁和悲观锁的底层原理
乐观锁和悲观锁是并发编程中常用的两种锁机制,用于解决多线程或多进程环境下的并发访问问题。它们的底层原理和适用场景有所不同。
81 0
|
9月前
|
数据库
MyBatisPlus的乐观锁和悲观锁
MyBatisPlus的乐观锁和悲观锁
102 0
|
缓存 Oracle Java
hibernate学习之三(悲观锁与乐观锁)
hibernate学习之三(悲观锁与乐观锁)
|
安全 Java 数据库连接
【mybatis-plus】什么是乐观锁?如何实现“乐观锁”
【mybatis-plus】什么是乐观锁?如何实现“乐观锁”
【mybatis-plus】什么是乐观锁?如何实现“乐观锁”
|
数据采集 算法 Java
锁住它,快告诉我乐观锁与悲观锁的区别?
锁住它,快告诉我乐观锁与悲观锁的区别?
114 1
锁住它,快告诉我乐观锁与悲观锁的区别?
|
SQL 安全 关系型数据库
悲观锁和乐观锁的区别以及实现方式
悲观锁和乐观锁的区别以及实现方式详细解答
336 0
|
SQL 算法 安全
看完你就应该能明白的悲观锁和乐观锁
Java 按照锁的实现分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解 Java 多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现方式。
125 0
看完你就应该能明白的悲观锁和乐观锁