[转]Hibernate----悲观锁与乐观锁、Hibernate的锁定机制
出自:
http://www.blogjava.net/pengpenglin/archive/2010/03/15/315444.html
【1】乐观锁定(Optimistic locking)采用的版本策略有:先提交为主(First commit win)、后提交为主(Last commit win)、合并冲突更新(Merge cofilcting updates)
【2】乐观锁定采用的版本策略实际上和SVN的版本冲突解决方案是同样的:采用其它人的(先提交的)、采用自己的(后提交的)、合并他人和自己的(合并冲突更新)
【3】Hibernate推荐采用“版本号来实现先提交为主”的乐观锁定模式。在数据库中增加一个列version,每次读取时连该列一起读取,在更新的时候将此版本号和数据库中的版本号进行比较,如果大于等于则可以更新,如果小于则抛出异常。
【4】Hibernate同时支持“检查对象最后一次更新前的属性实现先提交为主”的模式:它适用于数据库不在本地,或者不能更改的情况。它通过比较当前对象的属性和数据库中对象的属性,如果发现在读出后有更改则抛出异常。
【5】Hibernate的乐观锁定必须在配置文件hibernate.cfg.xml中定义:<class name="xxx.xxx" table = "xxx" optimistic-lock="all/version" [dynamic-update="true"]>来设定。version表示使用版本号锁定,all配合dynamic-update表示使用对象属性检查做为版本检查依据
【6】悲观锁定(Pessimistic locking)会采用基于数据库提供的锁机制来进行锁定。它会在物理层对行甚至表进行锁定。使得应用的并发性变差。
【7】Hibernate支持通过Query或Criteria的setLockMode(XXX)方法来设定表或行的锁定模式,其支持的模式如下:
※ LockMode.NONE 如果在Hibernate的缓存中存在指定对象,就直接返回该对象的引用;否则就通过Select语句到数据库中加载该对象。这是默认值
※ LockMode.Read 不管Hibernate的缓存中是否存在指定对象,总是通过select语句到数据库中加载该对象;如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的指定对象是否和数据库中的版本一致。
※ LockMode.UPGRADE 不管Hibernate的缓存中是否存在指定对象,总是通过select语句到数据库中加载该对象;如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的指定对象是否和数据库中的版本一致。如果数据库系统支持悲观锁就执行select ... for update语句,如果数据库系统不支持悲观锁,就执行普通的select语句。
※ LockMode.UPGRADE_NOWAIT 和LockMode.UPGRADE具有同样的功能。此外对于Oracle数据库,执行select ... for update nowait语句
※ LockMode.WRITE 当Hibernate向数据库保存或者更新一个对象时,会自动使用此模式。这种模式仅供Hibernate内部使用。
分享到:
相关推荐
### Hibernate的乐观锁与悲观锁 #### 一、引言 在并发环境下,尤其是在金融、电商等业务场景中,确保数据的一致性和完整性至关重要。**Hibernate**作为一种流行的Java持久层框架,提供了多种机制来处理并发控制...
【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...
Hibernate 锁机制_悲观锁和乐观锁 Hibernate 锁机制是指在... Hibernate 的锁机制可以分为悲观锁和乐观锁两种,悲观锁通过数据库层次的锁定来实现,而乐观锁通过应用程序上的逻辑实现版本控制的方法来维护正确的数据。
悲观锁和乐观锁是两种常见的锁定策略,它们各有特点,适用于不同的场景。 **悲观锁**(Pessimistic Lock)的名字来源于其悲观的态度,它认为数据随时可能被其他事务修改,因此在读取数据时就立即进行加锁,防止其他...
本文主要讨论的是Hibernate框架中两种锁机制的使用:乐观锁和悲观锁。 首先,让我们深入理解悲观锁(Pessimistic Locking)。悲观锁正如其名字所示,假设并发环境中数据会被频繁修改,所以在整个数据处理过程中,它...
### Hibernate的乐观锁和悲观锁 #### 一、引言 在软件开发中,尤其是在涉及大量并发操作的应用场景下,确保数据的一致性和完整性是非常重要的。对于基于Java Web的应用而言,Hibernate作为一款流行的ORM框架,提供...
《Hibernate 悲观锁与乐观锁详解》 在多用户并发访问的环境中,数据库管理系统必须具备有效的数据访问控制机制,以确保数据的一致性和完整性。Hibernate,作为一款流行的Java持久化框架,提供了两种主要的锁定策略...
在Java的持久化框架Hibernate中,悲观锁和乐观锁是两种重要的并发控制策略,它们用于管理数据库中的数据在多线程环境下的访问安全。本文将深入探讨这两种锁机制的原理、应用场景及其区别。 首先,我们来理解悲观锁...
在处理并发问题时,Hibernate提供了悲观锁和乐观锁两种机制。 悲观锁假设并发环境中的冲突是常态,因此在读取数据时就立即锁定,直到事务结束才释放。在Hibernate中,可以通过设置`@LockModeType.PESSIMISTIC_READ`...
在乐观锁的机制下,假设并发用户很少会发生冲突,所以在读取数据时不会进行任何锁定,而在更新数据时才会检查在此期间是否有其他用户修改过该数据。如果检测到有其他用户修改,更新操作将会失败,通常会抛出一个异常...
乐观锁与悲观锁相反,它假定数据不太可能被其他线程或进程修改,因此不会一开始就锁定数据。这种锁机制通常不会直接使用数据库级别的锁定机制,而是通过版本号或其他标记来检测数据是否已被其他事务修改。 **1. ...
在多线程环境下,为了保证数据的一致性和完整性,数据库管理系统提供了多种锁定机制,其中乐观锁和悲观锁是两种常见的实现方式。 1. **悲观锁**:悲观锁假设数据在操作过程中可能会被其他并发事务修改,因此在读取...
- **乐观锁**: 不直接锁定数据,在提交更改前检查数据是否被其他事务修改过。 #### 七、Session实际应用 - **事务边界**: 在事务开始和结束时管理Session的生命周期。 - **懒加载**: 只在需要时加载关联对象的数据...
Hibernate锁定策略** - **悲观锁**:在读取数据时就锁定记录,保证其他用户无法修改,直到事务结束释放锁。悲观锁适用于高并发环境下对数据修改频繁的情况,但可能会导致锁竞争,降低系统吞吐量。 - **乐观锁**:在...
**悲观锁**是预防性的锁定策略,它假设并发环境中多线程可能会同时修改同一数据,因此在读取数据时就对其进行锁定,直至事务结束才释放。在Hibernate中,悲观锁可以通过`LockMode`进行设置,如`LockMode.WRITE`、`...
- **悲观锁**:在读取数据时就锁定资源,防止其他事务修改,直至事务结束释放锁。Hibernate通过`@Lock`注解配合`LockModeType`实现悲观锁。 **5. 事务的回滚规则** - 任何未捕获的`HibernateException`或`JDBC...
- **悲观锁**:适用于写多读少的场景,通过数据库级别的行级锁等方式实现。 - **行级锁**:在执行更新操作前锁定目标行,确保数据的一致性。 - **读锁和写锁**:读锁允许多个线程同时读取数据,而写锁则独占资源...
**悲观锁**(Pessimistic Lock)与**乐观锁**(Optimistic Lock)是数据库和对象关系映射(ORM)框架中两种重要的锁定机制,主要用于解决并发控制问题。 ##### 悲观锁 悲观锁假设数据会被频繁地并发访问和修改,...