`

hibernate之乐观锁(Optimistic Locking)

阅读更多

相对于悲观锁,乐观锁采取了更加宽松的加锁机制,悲观锁大多数是依赖于数据库,如果对于一个长事务来说,这样的开销会很大!

 

如:在银行系统中,一个人想从银行取钱,他的公司正好在这个时候往他的卡里打钱,如果使用悲观锁的话,会将它的帐号暂时锁死,一个人还好,如果要是有成千上万个巧合呢?这样的话,银行的数据库的压力会很大;

 

乐观锁机制在一定程度上解决了这个问题,乐观锁,大多是基于数据版本(version)记录机制实现,何为数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个“version”字段来实现;

读取数据时,将版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息化时,如果提交的数据版本号大于数据库表当前版本号,则予更新,否则认为是过期数据;

 

回到银行的例子中:那个人取了2000;当取钱的操作执行完后将数据版本号+1(version=2);公司也往里打了3000,将版本号+1(version=2);公司打钱的操作提交时发现有相同的版本号,那么这个操作被驳回;

 

从例子中可以看出,乐观锁机制避免了长事务中的数据库加锁开销,大大提升了并发量下的系统整体性能表现;

 

需要注意的是:乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性,如银行的例子,由于乐观锁机制在我们系统中实现,来自系统外部的用户余额更新操作不受我们影响,因此可能会造成非法数据被更新到数据库中;

 

Hibernate在其数据访问引擎上内置了乐观锁实现,如果不用考虑外部系统对数据库更新操作,利用hibernate提供的透明化乐观锁实现,会简洁!

 

Hibernate中使用乐观锁:

<class name="TUser" table="t_user" optimistic-lock="version">	

 optimistic-lock有如下可选取值:

  • none 无乐观锁
  • version 通过版本机制实现乐观锁
  • dirty 通过检查发生变动过的属性实现乐观锁
  • all 通过检查所有属性实现乐观锁

其中Version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现,也是Hibernate中,目前唯一在实体对象脱离Session发生修改的情况下依然有效的锁机制。这种方法使用较多!

		<version name="version" column="version" type="integer"></version>

 version节点必须出现id节点后;

分享到:
评论

相关推荐

    Hibernate的乐观锁与悲观锁

    #### 三、乐观锁(Optimistic Locking) ##### 3.1 定义 乐观锁基于一种假设:大多数并发操作都不会引起冲突。它通过比较数据版本号(或最后一次修改时间戳)等方式来判断数据是否被修改,从而决定是否需要回滚事务...

    Hibernate乐观锁和悲观锁分析

    【Hibernate乐观锁与悲观锁详解】 在开发过程中,尤其是在并发环境下,确保数据的一致性和完整性至关重要。Hibernate,作为Java领域广泛使用的ORM框架,提供了一种处理并发数据访问冲突的手段,那就是锁机制。主要...

    hibernate的乐观锁和悲观锁

    #### 三、乐观锁(Optimistic Locking) 乐观锁则假设数据不会被外部修改,因此不会主动锁定数据,而是在提交事务时检查数据是否被其他事务修改过。这种机制减少了锁的竞争,从而提高了系统的并发能力。乐观锁通常...

    hibernate乐观锁和悲观锁学习

    接下来是乐观锁(Optimistic Locking)。与悲观锁不同,乐观锁假设并发环境下数据不会被同时修改,因此在读取数据时不会立即加锁。只有在更新数据时,才会检查数据是否自上次读取后发生了变化。在Hibernate中,通常...

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

    二、乐观锁(Optimistic Locking) 乐观锁是一种乐观的认为资料的存取很少发生同时存取的问题,不作数据库层次上的锁定,而是通过应用程序上的逻辑实现版本控制的方法来维护正确的数据。 在 Hibernate 中,乐观锁...

    Java 中的悲观锁和乐观锁的实现

    #### 二、乐观锁(Optimistic Locking) 乐观锁与悲观锁相反,它假定数据不太可能被其他线程或进程修改,因此不会一开始就锁定数据。这种锁机制通常不会直接使用数据库级别的锁定机制,而是通过版本号或其他标记来...

    hibernate:一对多,多对多,一对一,乐观锁,二级缓存

    4. **乐观锁(Optimistic Locking)**: 乐观锁是一种非阻塞的并发控制策略,假设并发情况下冲突较少。Hibernate通过版本号或时间戳实现乐观锁,即在实体类中添加一个版本字段,并在更新时检查版本是否一致。如果...

    hibernate源码

    `hibernate_optimistic_locking`文件可能讨论了Hibernate的乐观锁机制。乐观锁在读取数据时不加锁,而在更新时检查数据是否被其他事务修改,如果发现有冲突,则回滚事务。通过版本号或时间戳等方式实现,适合读多写...

    Hibernate4实战 之第五部分:Hibernate的事务和并发

    1. **乐观锁(Optimistic Locking)**:假设数据不会经常冲突,只有在提交时才会进行冲突检测。Hibernate 通过版本字段实现自动乐观并发控制。 2. **悲观锁(Pessimistic Locking)**:假设数据冲突很常见,因此在数据...

    hibernate 2

    乐观锁(Optimistic Locking)是一种并发控制机制,主要用于多用户环境下数据库记录的并发操作控制。与悲观锁(Pessimistic Locking)相比,乐观锁假设多个事务在处理数据时不会发生冲突,只有在事务提交时,才通过...

    Hibernate4.1.11中文手册

    同时,也会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的使用场景和实现方法。 查询是Hibernate的重要功能,手册会详细讲解HQL和Criteria API的用法。HQL类似于SQL,但更为面向对象,可以...

    hibernate5.0中文文档

    此外,还会讨论乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)的实现方法。 除此之外,文档还会介绍第二级缓存(Second Level Cache)和查询缓存(Query Cache),这两种缓存机制能显著提升应用程序...

    org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException

    这个异常通常在乐观锁(Optimistic Locking)机制失败时抛出,意味着在数据库操作过程中,数据的版本信息(version)与预期不符,即在读取和更新之间,数据已被其他事务修改。 乐观锁是一种并发控制策略,它假设在...

    Hibernate4.1

    14. **版本控制(Optimistic Locking/Pessimistic Locking)**:Hibernate提供乐观锁和悲观锁来防止并发访问时的数据冲突。 15. **事件监听器**:可以通过实现特定接口或使用注解来监听持久化过程中的各种事件,如...

    Hibernate 经典例子全

    `hibernate_lazy_for_single_end`和`hibernate_optimistic_locking`涉及到对象状态管理和并发控制。懒加载是一种优化策略,仅在需要时才加载关联对象。乐观锁则是并发控制的一种方法,它假设在大多数情况下不会发生...

    hibernate。jar

    乐观锁是Hibernate提供的并发控制策略之一。在这里,我们将了解如何使用版本字段或时间戳来防止数据的脏读、不可重复读和幻读,以及如何处理乐观锁冲突。 4. **Chapter 21 - Struts2 First**: 本章节结合Struts2...

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

    除了`@Version`,Hibernate还提供了其他方式来实现并发控制,如`@OptimisticLocking`注解,可以自定义乐观锁的字段。另外,悲观锁可以通过`@Lock`注解实现,它在查询时就锁定数据,确保其他事务不能修改。 在实际...

Global site tag (gtag.js) - Google Analytics