`
sameseam
  • 浏览: 23358 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

hibernate,jpa锁机制

 
阅读更多

在高并发的计算机群组成的负载均衡环境中,经常会碰到多个节点更新同一条数据,从而引起数据不一致的问题!

场景

有 A ,B 2台WEB服务器,负载均衡处理请求, C为数据库服务器, 有订单Order, 订单初始的金额为 300

如果 A B同时调整订单金额 减少100元,将会存在如下情况。

A -> Order.amount(200) -100 = 200
B -> Order.amount(200)- 100 = 200;

但是原本是 A ,B 分别减少100 ,正确的Order.amount的最终值应该是 100, 而现在变成了 200,这个错误的值

如果你的系统采用原生的SQL 那么在做Update操作的时候,是不会存在这个问题

Java代码 复制代码
  1. updateordersetamount=amount-100whereid=xxxx


由数据库进行并发同步。

可是我们在开发JAVA系统时,大多数都会采用Hibernate这种ORM框架,所以在做更新操作的时候,是不太可能直接写SQL, 往往都会先读取实体的值,再进行Update操作,那么就会出现上面所说的问题。

在解决这类问题时,我们想到的就是采用数据库的乐观锁原理。 给数据库表添加一个version的版本号字段,每次更新的时候都会带上这个version作为where 条件,如果更新的记录返回为0条,表示数据已经被其它人所修改

在Hibernate3的时候,已经有一个@Version的标签,只要给实体标记就可以了,每次Update操作的时候,都会自动带上这个 version条件

Java代码 复制代码
  1. @Entity
  2. publicclassVersionTest{
  3. privateLongid;
  4. privateIntegerversion;
  5. privateBigDecimalamount;
  6. @Id
  7. @Column(name="oid")
  8. @GeneratedValue
  9. publicLonggetId(){
  10. returnthis.id;
  11. }
  12. publicvoidsetId(Longid){
  13. this.id=id;
  14. }
  15. @Version
  16. @OptimisticLock(excluded=true)
  17. publicIntegergetVersion(){
  18. returnversion;
  19. }
  20. publicvoidsetVersion(Integerversion){
  21. this.version=version;
  22. }
  23. publicBigDecimalgetAmount(){
  24. returnamount;
  25. }
  26. publicvoidsetAmount(BigDecimalamount){
  27. this.amount=amount;
  28. }
  29. }
分享到:
评论

相关推荐

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

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

    Hibernate annotation JPA 一对多,多对多

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

    Hibernate3个jar包

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

    07_JPA详解_使用JPA加载_更新_删除对象.zip

    Java Persistence API(JPA)是Java平台上的一个标准,用于...理解并熟练掌握JPA的加载、更新和删除机制,有助于提高代码的可读性和数据库操作效率。通过深入学习和实践,你可以更好地应对复杂的企业级应用开发需求。

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

    1. **JPA历史**:简述JPA的起源和发展,以及其与Hibernate、TopLink等ORM工具的关系。 2. **API详解**:深入解析`EntityManager`、`EntityManagerFactory`、`Query`等关键接口和类的用法。 3. **继承和多态性**:...

    jpa 所要的jar包

    同时,了解和熟悉JPA的缓存机制、乐观锁和悲观锁、级联操作等高级特性,能够帮助你写出更加优化的代码。 总的来说,JPA作为ORM的一种解决方案,极大地简化了Java应用与数据库之间的交互,提高了开发效率。在使用...

    Hibernate Developer Guide

    Hibernate中的锁机制用来管理并发事务,以确保数据的一致性。文档详细讲解了乐观锁和悲观锁的实现,包括版本号和时间戳机制。 ### 缓存 缓存是Hibernate中一个关键特性,用来减少数据库的访问频率,提高性能。文档...

    hibernate电子书小压缩包

    还有,乐观锁和悲观锁机制,用于并发控制,保证数据的一致性。 在实际项目中,我们还需要考虑事务管理。Hibernate支持JTA(Java Transaction API)和JPA(Java Persistence API)的事务管理方式,可以很好地与...

    Spring Data JPA 原理与实战2021年

    │ 14 乐观锁机制和重试机制在实战中应该怎么用.mp │ 18 生产环境多数据源的处理方法有哪些?.mp4 │ 19 如何搞清楚事务、连接池的关系?正确配置是怎样的?.mp4 │ 20 Spring JPA 中的 Hibernate 加载过程与...

    Spring Data JPA1.7中文文档

    支持乐观锁和悲观锁机制,以处理并发控制。 3.7. **审计** Spring Data JPA 可以与 JPA 审计框架(如 Hibernate Envers)集成,提供数据变更的追踪。 **Spring Data 扩展** 2.7. **Spring Data 扩展** 框架提供了...

    Hibernate关键知识点大全

    12. **锁机制** - 悲观锁和乐观锁是并发控制的两种方式,悲观锁假设冲突频繁,乐观锁则在数据修改时检查冲突。 13. **缓存机制** - Hibernate的一级缓存是Session级别的,二级缓存是SessionFactory级别的,它们能...

    hibernate-jar包

    同时,它还提供了乐观锁和悲观锁机制,以确保多用户环境下的数据一致性。 总的来说,"hibernate-jar包"是一个全面的工具集,它简化了Java应用程序与数据库的交互,通过提供强大的ORM功能,使开发者能够更专注于业务...

    hibernate5.0中文文档

    Hibernate还支持JPA(Java Persistence API),因此,对于熟悉JPA的开发者,文档也会给出相应的指导。 最后,文档可能会提供一些最佳实践和常见问题解答,帮助开发者避免陷阱,提高开发效率。 总的来说,...

    Hibernate5 的用户手册中文版

    介绍了拦截器的使用和配置,Hibernate的声明式安全机制,以及JPA的回调接口。 13. HQL与JPQL: 说明了Hibernate查询语言(HQL)和Java持久化查询语言(JPQL)的使用,包括大小写敏感性,语句类型(Select,Update,...

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

    Hibernate通过事务和锁机制帮助开发者避免这些问题。 9. **实体状态与生命周期**:理解Hibernate中的临时态、持久态、瞬时态和脱管态对于正确处理并发事务至关重要。 10. **最佳实践**:包括合理设计实体关系、...

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

    此外,Hibernate还支持使用JPA的@Lock注解来实现更细粒度的锁控制,如读锁(LockModeType.READ)和写锁(LockModeType.PESSIMISTIC_WRITE)。通过这些机制,开发者可以有效地解决并发环境下的数据一致性问题。 描述...

    Hibernate5用户手册中文版

    8. 锁章节,讨论了Hibernate提供的乐观锁和悲观锁的实现,包括使用版本号、时间戳、LockMode类等方法来控制并发访问。 9. Fetching(抓取)章节,说明了如何配置和应用不同的抓取策略来优化数据库访问和提升性能。...

    Hibernate 手册中文版chm格式

    9. 事务和并发:讲解如何在Hibernate中管理和控制事务,以及如何处理并发问题,如锁机制。 10. 第二级缓存和查询缓存:提高性能的重要手段,讲解如何配置和使用缓存。 11. 性能优化:提供各种优化技巧,如批处理、...

    jpademo2.rar

    为了处理并发问题,JPA提供了乐观锁和悲观锁机制。乐观锁基于版本号或时间戳,悲观锁则在查询时锁定记录。 10. **实体关系映射** JPA允许定义不同类型的实体关系,如一对一(OneToOne)、一对多(OneToMany)、多...

Global site tag (gtag.js) - Google Analytics