`

Hibernate 的 LockMode 分析总结

阅读更多

悲观锁

在应用程序中显示地为数据资源加锁 . 悲观锁假定当前事务操纵数据资源时 , 肯定还会有其它事务同时访问该数据资源 , 为了避免当前事务的操作受到干扰 , 先锁定资源 . 尽管悲观锁能防止丢失更新和不可重复读这类并发问题 , 但会影响并发性能 .

 

乐观锁

假定当前事务操纵数据资源时 , 不会有其它事务同时访问该数据资源 , 因此完全依靠数据库的隔离级别来自动管理锁的工作 . 应用程序采用版本控制手段来避免可能出现的并发问题 .

 

LockMode 类表示的几种锁定模式

锁定模式

描述

LockMode.NONE

如果缓存中存在对象 , 直接返回该对象的引用 , 否则通过 select 语句到数据库中加载该对象 , 默认值 .

LockMode.READ

不管缓存中是否存在对象 , 总是通过 select 语句到数据库中加载该对象 , 如果映射文件中设置了版本元素 , 就执行版本检查 , 比较缓存中的对象是否和数据库中对象版本一致

LockMode.UPGRADE

不管缓存中是否存在对象 , 总是通过 select 语句到数据库中加载该对象 , 如果映射文件中设置了版本元素 , 就执行版本检查 , 比较缓存中的对象是否和数据库中对象的版本一致 , 如果数据库系统支持悲观锁 ( Oracle/MySQL), 就执行 select...for update 语句 , 如果不支持 ( Sybase), 执行普通 select 语句

LockMode.UPGRADE_NOWAIT

LockMode.UPGRADE 具有同样功能 , 此外 , 对于 Oracle 等支持 update nowait 的数据库 , 执行 select...for update nowait 语句 ,nowait 表明如果执行该 select 语句的事务不能立即获得悲观锁 , 那么不会等待其它事务释放锁 , 而是立刻抛出锁定异常

LockMode.WRITE

保存对象时会自动使用这种锁定模式 , 仅供 Hibernate 内部使用 , 应用程序中不应该使用它

LockMode.FORCE

强制更新数据库中对象的版本属性 , 从而表明当前事务已经更新了这个对象

 

 

多个事务并发运行时的并发问题

第一类丢失更新 : 撤销一个事务时 , 把其它事务已提交的更新数据覆盖 .

第二类丢失更新 : 不可重复读中的特例 , 一个事务覆盖另一事务已提交的更新数据 .

脏读 : 一个事务读到另一事务未提交的更新数据 .

幻读 : 一个事务读到另一事务已提交的新插入的数据 .

不可重复读 : 一个事务读到另一个事物已提交的更新数据 .

 

锁的类型和兼容性

共享锁

l   加锁条件 : 当一个事务执行 select 语句时 , 数据库系统会为这个事务分配一把共享锁 , 锁定被查询的数据 .

l   解锁条件 : 数据被读取后 , 数据库系统立即解除共享锁 .

l   与其它锁的兼容性 : 如果数据资源上放置了共享锁 , 还能再放置共享锁和更新锁 .

l   并发性能 : 良好的并发性能 . 当多个事务读相同数据时 , 每个事务都会获得一把共享锁 , 可以同时读锁定的数据 .

独占锁

l   加锁条件 : 当一个事务执行 insert,update,delete , 数据库系统会自动对 SQL 语句操纵的数据资源使用独占锁 . 如果该数据资源已经有其它锁存在时 , 无法对其再放置独占锁 .

l   解锁条件 : 独占锁一直到事务结束后才能被解除 .

l   与其它锁的兼容性 : 独占锁不能和其他锁兼容 , 如果数据资源已经加上了独占锁 就不能再放置其它锁 , 同样 , 如果已经有了其它锁 , 就不能放置独占锁 .

l   并发性能 : 并发性能较差 , 只允许有一个事务访问锁定的数据 , 如果其他事务也需要访问该数据 , 就必须等待 , 直到前一个事务结束 , 解除了独占锁 , 其它事务才能访问该数据 .

更新锁

l   加锁条件 : 当一个事务进行 update 操作时 , 数据库系统会先为事务分配一把更新锁 .

l   解锁条件 : 当读取数据完毕 , 执行更新操作时 , 会把更新锁升级为独占锁 .

l   与其它锁的兼容性 : 更新锁与共享锁兼容 , 即一个资源可以同时放置更新锁和共享锁 , 但是最多只能放置一把更新锁 , 这样 , 当多个事务更新相同的数据时 , 只有一个事务能获得更新锁 , 然后再把更新锁升级为独占锁 , 其它事务必须等到前一个事务结束后 , 才能获得更新锁 , 避免了死锁 .

l   并发性能 : 允许多个事务同时读锁定资源 , 但不允许其它事务修改它 .

 

各种隔离级别所能避免的并发问题

隔离级别

是否出现第一类丢失更新

是否出现第二类丢失更新

是否出现脏读

是否出现幻读

是否出现不可重复读

Serializable 串行化

RepeatableRead 可重复读

ReadCommited 读已提交数据

ReadUncommited 读未提交数据

 

0
0
分享到:
评论

相关推荐

    hibernate3.2+cglib2.2架包

    CGlib使用ASM库(一个Java字节码操纵和分析框架)来创建目标类的子类,从而可以在运行时动态地插入新的方法。在Hibernate中,当使用代理模式时,如动态代理或懒加载机制,可能会用到CGlib来创建对象的代理。 具体到...

    Hibernate的Criteria用法总结.doc

    Hibernate 的 Criteria 用法总结 Hibernate 的 Criteria 是一个完全面向对象、可扩展的条件查询 API,通过它完全不需要考虑数据库底层如何实现、SQL 语句如何实现。Criteria 提供了灵活的查询条件组装方式,能够...

    Hibernate乐观锁和悲观锁分析

    Hibernate支持的悲观锁模式有`LockMode.UPGRADE`(对应SQL的`for update`)和`LockMode.UPGRADE_NOWAIT`(Oracle特有的,用于立即返回等待超时的结果)。 **乐观锁(Optimistic Locking)** 乐观锁则相对乐观,它...

    Hibernate 事务和并发控制

    Hibernate提供了LockMode类型的锁,如LockMode.READ、LockMode.WRITE和LockMode.UPGRADE,分别对应不同的锁定级别。 此外,Hibernate还支持读写分离和第二级缓存来优化并发性能。读写分离将读操作和写操作分散到...

    hibernate的乐观锁和悲观锁

    - `LockMode.WRITE`:Hibernate在插入或更新记录时自动获取。 - `LockMode.READ`:Hibernate在读取记录时自动获取。 - `LockMode.UPGRADE`:利用数据库的`FOR UPDATE`子句加锁。 - `LockMode.UPGRADE_NOWAIT`:...

    hibernate事务管理机制.doc

    在Hibernate中,悲观锁可以通过`LockMode`进行设置,如`LockMode.WRITE`、`LockMode.UPGRADE`等。例如,使用`session.get()`或`session.createQuery().setLockMode()`方法可以在查询时加锁。`LockMode.UPGRADE`会...

    hibernate事务,并发及缓存管理实例

    Hibernate还支持LockMode,包括READ、WRITE、UPGRADE和OPTIMISTIC等,以适应不同级别的并发控制需求。 三、缓存管理 缓存技术可以显著提升应用性能,减少数据库访问。Hibernate的缓存分为一级缓存和二级缓存。一级...

    Hibernate悲观锁和乐观锁的实现

    2. **LockMode**: Hibernate提供了LockMode类,可以通过Session的`lock()`或`update()`方法,指定LockMode.PESSIMISTIC_WRITE或LockMode.PESSIMISTIC_READ来获取悲观锁。 **乐观锁**(Optimistic Lock)则相对乐观...

    hibernate乐观锁和悲观锁学习

    在Hibernate中,我们可以使用`setLockMode`方法对查询结果进行加锁,例如设置`LockMode.UPGRADE`,这将使Hibernate在执行SQL时添加`FOR UPDATE`子句,从而实现悲观锁。 接下来是乐观锁(Optimistic Locking)。与...

    Hibernate查询解决方案

    - `load(Class<T> theClass, Serializable id, LockMode lockMode)`:根据类类型、主键和锁定模式加载对象。 - `load(Object object, Serializable id)`:根据对象和主键加载对象。 - **`createQuery` 方法**:...

    Hibernate5用户手册中文版

    8. 锁章节,讨论了Hibernate提供的乐观锁和悲观锁的实现,包括使用版本号、时间戳、LockMode类等方法来控制并发访问。 9. Fetching(抓取)章节,说明了如何配置和应用不同的抓取策略来优化数据库访问和提升性能。...

    Hibernate缓存深入详解 from ITEye

    **Hibernate缓存深入详解** ...总结,理解并熟练运用Hibernate的缓存机制,能够有效提升Java应用的性能,同时要时刻关注数据一致性问题,以确保系统的稳定运行。在实践中不断探索和优化,才能更好地发挥缓存的优势。

    Hibernate Developer Guide

    ### Hibernate 开发者指南知识点详解 #### 一、前言 Hibernate是一款开源的对象关系映射(Object Relational Mapping,简称ORM)框架,它为Java应用提供了对关系型数据库的高效持久化支持。Hibernate的主要特点...

    Hibernate的乐观锁与悲观锁

    #### 四、总结 选择使用悲观锁还是乐观锁取决于具体的应用场景。对于那些并发读取多而写入少的情况,建议使用乐观锁;而对于需要频繁进行更新操作且不能容忍数据不一致性的场景,则更适合使用悲观锁。理解这两种锁的...

    Hibernate5 的用户手册中文版

    锁章节讲解了乐观锁和悲观锁的使用和管理,包括乐观锁的版本号和时间戳机制,悲观锁的使用以及LockMode类的介绍。 9. Fetching(抓取): 抓取章节介绍了抓取策略,包括不抓取、通过查询动态抓取以及通过配置文件...

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

    在 Hibernate 中,悲观锁的实现方式有多种,例如使用 `LockMode.UPGRADE` 加锁方式,或者使用 `for update` 语句来锁定数据。在查询开始之前加锁,才会真正通过数据库的锁机制加锁处理。 二、乐观锁(Optimistic ...

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

    在Hibernate框架中,悲观锁通过`LockMode.PESSIMISTIC_READ`和`LockMode.PESSIMISTIC_WRITE`来实现。`PESSIMISTIC_READ`通常用于读取数据时避免其他事务更新,而`PESSIMISTIC_WRITE`则更严格,不仅阻止更新,也阻止...

    Hibernate中Criteria的完整用法

    对于 Criteria 还可以设置 FlushModel(冲刷 Session 的方式)和 LockMode(数据库锁模式)。 Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来添加查询条件。Criterion 接口的...

Global site tag (gtag.js) - Google Analytics