`

Hibernate的两种锁机制

 
阅读更多

Hibernate支持两种锁机制:
即通常所说的“悲观锁(Pessimistic Locking)”和
“乐观锁(OptimisticLocking)”。
悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
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子句实现加锁。
乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
悲观锁与乐观锁的比较:
悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受;
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性,如在上例中,由于乐观锁机制是在我们的系统中实现,来自外部系统的更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。在
系统设计阶段,我们应该充分考虑到这些情况出现的可能性,并进行相应调整(如将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途径,而不是将数据库表直接对外公开)。
Hibernate 在其数据访问引擎中内置了乐观锁实现。如果不用考虑外部系统对数据库的更新操作,利用Hibernate提供的透明化乐观锁实现,将大大提升我们的生产力。
Hibernate中可以通过class描述符的optimistic-lock属性结合version描述符指定。
optimistic-lock属性有如下可选取值:
Ø none
无乐观锁
Ø version
通过版本机制实现乐观锁
Ø dirty
通过检查发生变动过的属性实现乐观锁
Ø all
通过检查所有属性实现乐观锁
其中通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,同时也是Hibernate中,目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机制。因此,一般情况下,我们都选择version方式作为Hibernate乐观锁实现机制。

分享到:
评论

相关推荐

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

    Hibernate 中有两种锁机制:悲观锁和乐观锁。 一、悲观锁(Pessimistic Locking) 悲观锁是一种预防并发访问的机制,Hibernate 通过对数据库的锁定来实现。悲观锁假定任何时刻存取数据时,都可能有另一个客户也...

    Hibernate的乐观锁与悲观锁

    本文将详细介绍这两种锁的原理、应用场景以及如何在Hibernate中实现。 #### 二、悲观锁(Pessimistic Locking) ##### 2.1 定义 悲观锁是一种较为传统的锁机制,它假定并发冲突的可能性很高,因此在整个数据处理...

    hibernate的乐观锁和悲观锁

    本文将深入探讨这两种锁的原理及应用场景,帮助开发者更好地理解和选择合适的锁策略。 #### 二、悲观锁(Pessimistic Locking) 悲观锁是一种假设数据会被外部(或同一系统中的其他事务)修改的观点,因此在整个...

    Hibernate乐观锁和悲观锁分析

    【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。...在使用Hibernate时,理解并正确配置这两种锁机制,能有效避免并发环境下的数据不一致性问题。

    hibernate乐观锁和悲观锁学习

    本文主要讨论的是Hibernate框架中两种锁机制的使用:乐观锁和悲观锁。 首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它...

    Hibernate悲观锁和乐观锁的实现

    悲观锁和乐观锁是两种常见的锁定策略,它们各有特点,适用于不同的场景。 **悲观锁**(Pessimistic Lock)的名字来源于其悲观的态度,它认为数据随时可能被其他事务修改,因此在读取数据时就立即进行加锁,防止其他...

    Hibernate悲观锁与乐观锁案例

    本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁的概念。悲观锁正如其名,持有一种悲观的态度,认为数据在任何时候都可能被其他线程修改,因此在读取数据时会立即加上锁,确保在读取...

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

    数据库事务是数据库操作的核心组成部分,它确保了数据的一致性和完整性。事务是由一系列数据库操作组成的逻辑单元,这些操作要么全部成功...了解并熟练掌握这两种锁机制,有助于设计出更高效、更稳定的并发控制策略。

    Hibernate version 乐观锁 (xml方式)

    然而,当数据冲突频繁时,乐观锁可能导致大量的重试或者异常处理,所以选择哪种锁机制应根据实际的业务场景来定。 在了解了Hibernate乐观锁的XML配置后,我们可以结合源码进一步分析其实现细节。在Hibernate中,...

    Hibernate乐观锁

    Hibernate乐观锁是数据库事务控制的一种策略,主要用于处理并发更新数据的情况。在乐观锁的机制下,假设并发用户很少会发生冲突,所以在读取数据时不会进行任何锁定,而在更新数据时才会检查在此期间是否有其他用户...

    Hibernate悲观锁与乐观锁

    《Hibernate 悲观锁与乐观锁详解》 在多用户并发访问的环境中,数据库管理系统必须具备有效的数据访问控制机制,以确保数据的一致性和完整性...开发者应根据实际应用场景选择合适的锁机制,以平衡数据安全和系统性能。

    Hibernate 乐观和悲观锁

    3. **源码分析**:理解Hibernate的乐观锁和悲观锁机制,需要深入源码。在Hibernate的`Session`接口中,有相应的`lock()`和`update()`方法,它们在背后实现了锁的逻辑。通过对这些方法的调用和跟踪,可以了解其内部...

    Hibernate中,利用版本管理机制来控制事务并发

    Hibernate支持两种类型的版本管理:`<version>`和`<timestamp>`。前者使用整型,后者使用时间戳,后者更加精确。 3. 版本验证:在更新数据时,Hibernate会先查询当前数据库中的版本号,然后与对象中的版本号进行...

    hibernate源码

    Hibernate提供两种高级查询语言:HQL(Hibernate Query Language)和Criteria API。HQL类似于SQL,但面向对象,允许开发者以类和属性的方式进行查询。Criteria API则提供了更动态、更面向对象的查询方式,适用于运行...

    Java的Hibernate框架数据库操作中锁的使用和查询类型

    本文将深入探讨Hibernate中的锁机制以及不同类型的查询,帮助开发者理解如何在并发环境中正确地管理数据。 一、为什么要使用锁? 1. 事务概念与ACID特性 事务是一组数据库操作,要求具有原子性(Atomicity)、一致...

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    8. **Criteria API和HQL**: Hibernate提供了HQL(Hibernate Query Language)和Criteria API两种查询语言,它们允许开发者以面向对象的方式来编写查询,比直接写SQL更加灵活和方便。 9. **缓存机制**: Hibernate...

Global site tag (gtag.js) - Google Analytics