比方说,我们有一个系统由多个用户使用,其中每个实体可以被多个用户修改。我们希望避免这种情况:两个人的加载一些信息,基于他们所看到的做出一些决定,然后在相同的时间。更新状态,我们不让让后一个用户覆盖前面一个用户做出的修改。
它也可以发生在服务器环境 - 多个事务可以修改共享的实体:
- 事务1加载数据
- 事务2更新数据,并确认
- 事务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
第二个用户看到这种出错,再也不能操作了,除非重新刷新页面。获取最新被修改的值。
优点:
- 它提供了一个方便,以自动化的方式来保持一致性,像上述的案例。这意味着,每一个动作只能执行一次,它保证用户或服务器过程中看到的是最新状态。
- 它需要很少的工作来设置。
- 由于其乐观的天性,速度非常快。没有锁定的任何地方,只是多了一个字段添加到查询中。
相关推荐
5. **乐观锁与悲观锁**:Hibernate提供了这两种并发控制策略。乐观锁假设冲突较少,只在提交时检查版本号;悲观锁则在读取数据时就进行锁定,防止其他事务修改。 6. **事务管理**:在Hibernate中,可以通过编程式...
- Hibernate支持自动的乐观锁管理,通过@Entity注解的@Version字段,Hibernate会在提交时自动处理版本号比较和更新。 此外,还有其他的并发控制策略,如行级锁定、两阶段锁定、多版本并发控制(MVCC)等。在实际应用...
- **多版本并发控制**: JPA 2.1引入了乐观锁和悲观锁策略,用于解决多线程环境下的数据一致性问题。 - **级联操作**: 支持在实体之间定义级联操作,如删除一个实体时自动删除与之关联的其他实体。 - **延迟加载**:...
为了处理并发访问,Hibernate提供了乐观锁和悲观锁机制。乐观锁通常通过版本号或者时间戳字段实现,而悲观锁则依赖于数据库提供的锁定机制。在实体类中添加`@Version`注解可以启用乐观锁。 以上内容详细解释了如何...
本文将结合Hibernate和JPA标准,深入探讨J2EE持久层设计中遇到的关键问题之一——事务并发访问控制策略。 #### 二、事务并发访问控制策略概述 事务并发访问控制主要包括两方面:同一个系统事务内的并发控制和跨...
5. **异步和并发**:讨论并发控制策略,如乐观锁和悲观锁,以及在多线程环境下的最佳实践。 这三本书合在一起,将为读者提供一个全面的JPA学习路径,从基本概念到高级特性的应用,再到实战技巧,有助于提升Java...
标题中的“day36 10-Hibernate中的事务:解决丢失更新”指的是在...通过理解并熟练运用Hibernate提供的事务控制机制、乐观锁和悲观锁等工具,开发者可以有效地避免丢失更新和其他并发问题,确保应用程序的数据完整性。
- **并发控制策略**:提供了更灵活的并发控制策略,如.optimistic-locking(乐观锁)和.pessimistic-locking(悲观锁),可以根据应用需求进行选择。 4. **连接池集成** - Hibernate支持多种连接池实现,如C3P0、...
- **事务和并发控制**:提供了更好的事务管理和并发控制策略,如乐观锁和悲观锁。 ### 3. Hibernate3.0 架构 - **Configuration**:负责配置信息的加载,如数据库连接信息、实体类映射信息等。 - **...
**乐观锁**通常是通过版本号或时间戳实现的。在Hibernate中,可以使用`@Version`注解来实现乐观锁。每次更新实体时,Hibernate会检查版本号是否匹配。如果版本不匹配,更新会被回滚,从而防止丢失更新。 ```java @...
乐观锁基于版本号或时间戳,悲观锁则在查询时锁定记录。 10. **实体关系映射** JPA允许定义不同类型的实体关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些...
例如,@GeneratedValue可以帮助我们自动生成主键值,@Temporal用于处理日期和时间类型,@Version则实现了乐观锁机制,确保并发访问时的数据一致性。 这三个库文件共同构成了Hibernate ORM的核心组件,使得开发者...
还讨论了并发控制中的乐观锁和悲观锁。 JNDI和锁:JNDI(Java Naming and Directory Interface)用于在Java应用程序中访问命名和目录服务。锁部分则介绍了乐观锁和悲观锁的概念及其使用方法。 Fetching(抓取):...
11. **事务与并发控制**:讨论Hibernate的事务管理,以及乐观锁、悲观锁等并发控制策略。 12. **事件监听与拦截器**:介绍如何使用事件监听器和拦截器进行自定义行为扩展。 13. **性能优化**:提供一些最佳实践和...
文档详细讲解了乐观锁和悲观锁的实现,包括版本号和时间戳机制。 ### 缓存 缓存是Hibernate中一个关键特性,用来减少数据库的访问频率,提高性能。文档将讨论查询缓存、查询缓存区域以及二级缓存提供者。 从上述...
锁章节讲解了乐观锁和悲观锁的使用和管理,包括乐观锁的版本号和时间戳机制,悲观锁的使用以及LockMode类的介绍。 9. Fetching(抓取): 抓取章节介绍了抓取策略,包括不抓取、通过查询动态抓取以及通过配置文件...
- 数据库事务与并发控制:掌握ACID属性,理解乐观锁、悲观锁的差异。 8. **Spring全家桶**: - Spring Core:理解依赖注入(DI)和面向切面编程(AOP),掌握Bean的生命周期管理。 - Spring MVC:使用Spring MVC...
- 乐观锁:通过版本字段实现,适用于读多写少的场景。 - 悲观锁:通过数据库的锁机制实现,适用于高并发下的写操作。 #### 五、最佳实践与常见问题解决 - **代码组织结构**:推荐采用DAO模式(Data Access ...
7. **事务和并发控制**:提供了更好的事务管理和并发策略,如乐观锁和悲观锁,适应不同场景的需求。 8. **增强的事件监听机制**:开发者可以通过实现特定接口注册监听器,以便在对象生命周期的不同阶段进行定制操作...