`
wbj0110
  • 浏览: 1591443 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JPA/Hibernate:基于版本的乐观锁并发控制

阅读更多

比方说,我们有一个系统由多个用户使用,其中每个实体可以被多个用户修改。我们希望避免这种情况:两个人的加载一些信息,基于他们所看到的做出一些决定,然后在相同的时间。更新状态,我们不让让后一个用户覆盖前面一个用户做出的修改。

  它也可以发生在服务器环境 - 多个事务可以修改共享的实体:

  1. 事务1加载数据
  2. 事务2更新数据,并确认
  3. 事务1基于第一步加载的数据(不是当前最新数据,最新数据已经被事务2修改过),执行某些计算并更新状态,

  解决办法使用@Version 如下:

@Entity
@Table(name = 'orders')
public class Order {
       @Id
       private long id;

       @Version
       private int version;

       private String description;

       private String status;

       // ... mutators
}

当这个实体被持久化时,version被设置为开始值。

只要它被更新,hibernate总是执行:

update orders  set description=?, status=?, version=?  where id=? and version=?

我们结合GUI来看一下执行顺序。

update orders
set description=?, status=?, version=2
where id=? and version=1

更新订单时, version被设置为2了。而同时另外一个version是1的用户也开始更新订单了:

update orders
set description=?, status=?, version=2
where id=? and version=1

这个更新无用,因为version已经变成了2. Hibernate会发现,抛出: org.hibernate.StaleObjectStateException

第二个用户看到这种出错,再也不能操作了,除非重新刷新页面。获取最新被修改的值。

优点:

 

  1. 它提供了一个方便,以自动化的方式来保持一致性,像上述的案例。这意味着,每一个动作只能执行一次,它保证用户或服务器过程中看到的是最新状态。
  2. 它需要很少的工作来设置。
  3. 由于其乐观的天性,速度非常快。没有锁定的任何地方,只是多了一个字段添加到查询中。
分享到:
评论

相关推荐

    Hibernate part 14:查询及数据库并发事务

    5. **乐观锁与悲观锁**:Hibernate提供了这两种并发控制策略。乐观锁假设冲突较少,只在提交时检查版本号;悲观锁则在读取数据时就进行锁定,防止其他事务修改。 6. **事务管理**:在Hibernate中,可以通过编程式...

    J2EE事务并发控制策略总结汇编.pdf

    - Hibernate支持自动的乐观锁管理,通过@Entity注解的@Version字段,Hibernate会在提交时自动处理版本号比较和更新。 此外,还有其他的并发控制策略,如行级锁定、两阶段锁定、多版本并发控制(MVCC)等。在实际应用...

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    - **多版本并发控制**: JPA 2.1引入了乐观锁和悲观锁策略,用于解决多线程环境下的数据一致性问题。 - **级联操作**: 支持在实体之间定义级联操作,如删除一个实体时自动删除与之关联的其他实体。 - **延迟加载**:...

    Hibernate annotation JPA 一对多,多对多

    为了处理并发访问,Hibernate提供了乐观锁和悲观锁机制。乐观锁通常通过版本号或者时间戳字段实现,而悲观锁则依赖于数据库提供的锁定机制。在实体类中添加`@Version`注解可以启用乐观锁。 以上内容详细解释了如何...

    JPA教程(全部为PDF格式的电子书)

    5. **异步和并发**:讨论并发控制策略,如乐观锁和悲观锁,以及在多线程环境下的最佳实践。 这三本书合在一起,将为读者提供一个全面的JPA学习路径,从基本概念到高级特性的应用,再到实战技巧,有助于提升Java...

    jee事务控制.pdf

    本文将结合Hibernate和JPA标准,深入探讨J2EE持久层设计中遇到的关键问题之一——事务并发访问控制策略。 #### 二、事务并发访问控制策略概述 事务并发访问控制主要包括两方面:同一个系统事务内的并发控制和跨...

    day36 10-Hibernate中的事务:解决丢失更新

    标题中的“day36 10-Hibernate中的事务:解决丢失更新”指的是在...通过理解并熟练运用Hibernate提供的事务控制机制、乐观锁和悲观锁等工具,开发者可以有效地避免丢失更新和其他并发问题,确保应用程序的数据完整性。

    最新hibernate 4.1.8.Final版本(2012年11-01最新发布)

    - **并发控制策略**:提供了更灵活的并发控制策略,如.optimistic-locking(乐观锁)和.pessimistic-locking(悲观锁),可以根据应用需求进行选择。 4. **连接池集成** - Hibernate支持多种连接池实现,如C3P0、...

    lib-Hibernate3.0 jar包

    - **事务和并发控制**:提供了更好的事务管理和并发控制策略,如乐观锁和悲观锁。 ### 3. Hibernate3.0 架构 - **Configuration**:负责配置信息的加载,如数据库连接信息、实体类映射信息等。 - **...

    (5)Hibernate中的many-to-many和并发

    **乐观锁**通常是通过版本号或时间戳实现的。在Hibernate中,可以使用`@Version`注解来实现乐观锁。每次更新实体时,Hibernate会检查版本号是否匹配。如果版本不匹配,更新会被回滚,从而防止丢失更新。 ```java @...

    jpademo2.rar

    乐观锁基于版本号或时间戳,悲观锁则在查询时锁定记录。 10. **实体关系映射** JPA允许定义不同类型的实体关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些...

    Hibernate3个jar包

    例如,@GeneratedValue可以帮助我们自动生成主键值,@Temporal用于处理日期和时间类型,@Version则实现了乐观锁机制,确保并发访问时的数据一致性。 这三个库文件共同构成了Hibernate ORM的核心组件,使得开发者...

    Hibernate5中文用户使用手册

    还讨论了并发控制中的乐观锁和悲观锁。 JNDI和锁:JNDI(Java Naming and Directory Interface)用于在Java应用程序中访问命名和目录服务。锁部分则介绍了乐观锁和悲观锁的概念及其使用方法。 Fetching(抓取):...

    hibernate3 chm 格式 中文

    11. **事务与并发控制**:讨论Hibernate的事务管理,以及乐观锁、悲观锁等并发控制策略。 12. **事件监听与拦截器**:介绍如何使用事件监听器和拦截器进行自定义行为扩展。 13. **性能优化**:提供一些最佳实践和...

    Hibernate Developer Guide

    文档详细讲解了乐观锁和悲观锁的实现,包括版本号和时间戳机制。 ### 缓存 缓存是Hibernate中一个关键特性,用来减少数据库的访问频率,提高性能。文档将讨论查询缓存、查询缓存区域以及二级缓存提供者。 从上述...

    Hibernate5 的用户手册中文版

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

    2023年B站Java后端面试最全攻略

    - 数据库事务与并发控制:掌握ACID属性,理解乐观锁、悲观锁的差异。 8. **Spring全家桶**: - Spring Core:理解依赖注入(DI)和面向切面编程(AOP),掌握Bean的生命周期管理。 - Spring MVC:使用Spring MVC...

    hibernate参考手册中文版

    - 乐观锁:通过版本字段实现,适用于读多写少的场景。 - 悲观锁:通过数据库的锁机制实现,适用于高并发下的写操作。 #### 五、最佳实践与常见问题解决 - **代码组织结构**:推荐采用DAO模式(Data Access ...

    hibernate-3.2.zip

    7. **事务和并发控制**:提供了更好的事务管理和并发策略,如乐观锁和悲观锁,适应不同场景的需求。 8. **增强的事件监听机制**:开发者可以通过实现特定接口注册监听器,以便在对象生命周期的不同阶段进行定制操作...

Global site tag (gtag.js) - Google Analytics