`
beisicao
  • 浏览: 66508 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多
    Hibernate支持乐观锁。当多个事务同时对数据库表中的同一条数据操作时,如果没有加锁机制的话,就会产生脏数据(duty data)。Hibernate有2种机制可以解决这个问题:乐观锁和悲观锁。这里我们只讨论乐观锁。
     Hibernate乐观锁,能自动检测多个事务对同一条数据进行的操作,并根据先胜原则,提交第一个事务,其他的事务提交时则抛出org.hibernate.StaleObjectStateException异常。
    Hibernate乐观锁是怎么做到的呢?
    我们先从Hibernate乐观锁的实现说起。要实现Hibenate乐观锁,我们首先要在数据库表里增加一个版本控制字段,字段名随意,比如就叫version,对应hibernate类型只能为 long,integer,short,timestamp,calendar,也就是只能为数字或timestamp类型。然后在hibernate mapping里作如下类似定义:

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

告诉Hibernate version作为版本控制用,交由它管理。
当然在entity class里也需要给version加上定义,定义的方法跟其他字段完全一样。
private Integer version;

// setVersion() && getVersion(Integer)

Hibernate乐观锁的的使用:
Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.openSession();
MyEntity et1 = session1.load(MyEntity.class, id);
MyEntity et2 = session2.load(MyEntity.class, id);
//这里 et1, et2为同一条数据
Transaction tx1 = session1.beginTransaction();
//事务1开始
et1.setName(“Entity1”);
//事务1中对该数据修改
tx1.commit();
session1.close();
//事务1提交
Transaction tx2 = session2.beginTransaction();
//事务2开始
et2.setName(“Entity2”);
//事务2中对该数据修改
tx2.commit();
session2.close();
//事务2提交

在事务2提交时,因为它提交的数据比事务1提交后的数据旧,所以hibernate会抛出一个org.hibernate.StaleObjectStateException异常。
回到前面的问题,Hibernate怎么知道事务2提交的数据比事务1提交后的数据旧呢?
因为MyEntity有个version版本控制字段。

回头看看上面的源代码中的:
MyEntity et1 = session1.load(MyEntity.class, id);
MyEntity et2 = session2.load(MyEntity.class, id);
这里,et1.version==et2.version,比如此时version=1,
当事务1提交后,该数据的版本控制字段version=version+1=2,而事务2提交时version=1<2所以Hibernate认为事务2提交的数据为过时数据,抛出异常。
这就是Hibernate乐观锁的原理机制。
我们已经知道了Hibernate乐观锁是根据version的值来判断数据是否过时,也就是说,在向数据库update某数据时,必须保证该entity 里的version字段被正确地设置为update之前的值,否则hibernate乐观锁机制将无法根据version作出正确的判断。
在我们的WEB应用中,尤其应该注意这个问题。
分享到:
评论
1 楼 至尊宝_唯一 2013-09-10  
分析比较到位,时间戳实现就比较危险

相关推荐

    hibernate事务管理机制.doc

    【hibernate事务管理机制】是指在使用Hibernate框架进行数据库操作时,如何管理和协调事务的一系列规则和策略。事务管理是确保数据一致性、完整性和并发控制的重要机制。 **悲观锁**是预防性的锁定策略,它假设并发...

    Hibernate事务和并发控制

    事务和并发控制是数据库管理中的核心概念,特别是在使用ORM框架如Hibernate时,理解它们的工作原理至关重要。本文将深入探讨Hibernate中的事务管理和并发控制。 首先,事务是数据库操作的基本单位,它保证了数据的...

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

    **描述:**描述为空,但我们可以推测博客内容可能包含实际示例、最佳实践以及对Hibernate查询API和事务管理机制的详细解释。 **标签:“源码”和“工具”** "源码"标签表明博客可能包含了与Hibernate源代码相关的...

    详解Hibernate事务处理机制

    本文将深入探讨Hibernate中的事务处理机制,并通过具体示例帮助读者更好地理解和运用。 #### 二、Hibernate事务处理基础 ##### 2.1 事务概念 在数据库操作中,事务是指一系列操作作为一个完整的单元来执行。这些...

    Hibernate教程26_事务并发处理

    总之,深入学习和掌握Hibernate中的事务并发处理,对于提升Java应用的数据管理能力具有重要意义。通过分析和实践s2sh_relation25_pessimistic_Lock.zip和s2sh_relation26_optimistic_Lock.zip中的源码,我们可以更好...

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

    #### 二、Hibernate事务管理机制 Hibernate 本身不实现事务逻辑,而是依赖于底层的数据源(JDBC 或 JTA)来实现事务管理。这意味着,当你使用 Hibernate 进行数据操作时,所涉及的事务要么基于 JDBC 的事务管理,要么...

    hibernate的事务核并发

    描述:本文深入解析了Hibernate框架中事务管理和并发控制的核心概念及其实现机制,基于一份详尽的“hibernate详细解析.pdf”文档,覆盖了非托管环境、JTA环境下的事务处理以及如何在不同场景下确保数据的一致性和...

    hibernate 对事务并发处理

    在 Hibernate 中,对事务并发处理是非常重要的, especialmente 在多用户环境中。事务处理的目的是为了保证数据的可靠性和一致性。 事务四个特性 ACID 1. 原子性(Atomicity):事务作为一个整体,所有操作要么...

    课程hibernate的事务和并发.pdf

    Hibernate通过自动版本管理来辅助并发控制,但不会改变内存中对象的锁定状态或事务隔离级别。对于行级悲观锁定,Hibernate提供了一个基于`SELECT FOR UPDATE` SQL语法的API,这在需要防止其他事务修改数据时特别有用...

    hibernate的事务和并发资料.pdf

    《Hibernate的事务和并发资料》深入探讨了在Java应用程序中使用Hibernate进行事务管理和并发控制的关键概念。Hibernate作为一款流行的ORM框架,它简化了与数据库的交互,但同时也需要开发者理解其背后的事务处理机制...

    day36 09-Hibernate中的事务:事务处理

    在Hibernate中,事务管理通常通过SessionFactory和Session接口来实现。 **二、SessionFactory与Session** SessionFactory是Hibernate的核心组件,它负责创建Session对象。Session对象则相当于JDBC中的Connection,...

    Hibernate的事务处理机制和flush方法的用法.docx

    总的来说,理解Hibernate的事务处理机制和`flush`方法的用法是避免异常和确保数据一致性的关键。通过谨慎地管理事务、正确使用`flush`,以及遵循并发控制的最佳实践,我们可以有效地防止和解决这类问题。在复杂的...

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

    在数据库管理中,事务是确保数据一致性的重要机制,而丢失更新是并发控制中可能出现的一种错误情况。 在数据库系统中,丢失更新是指两个或多个事务对同一数据进行修改,导致最终结果丢失了其中一个事务的更新。例如...

    day36 11-Hibernate中的事务:当前线程中的session

    本文将深入探讨Hibernate中的事务处理,特别是“当前线程中的Session”这一概念,以及如何在实际开发中有效地利用它。 在Hibernate中,Session是与持久化层交互的主要接口,它负责对象的持久化、检索、更新和删除等...

    学习J2EE事务并发控制策略总结.pdf

    综上所述,J2EE事务并发控制策略涉及到对数据库事务隔离级别的选择和使用乐观锁、悲观锁等机制来防止数据不一致性。理解这些概念并灵活应用是开发高效、稳定J2EE应用程序的关键。在实际开发中,应根据系统需求和预期...

    hibernate中session的管理

    本篇文章将详细探讨Hibernate中Session的管理,特别是如何利用ThreadLocal解决并发问题。 首先,SessionFactory是Hibernate的核心组件,它是一个线程安全的工厂类,用于创建Session实例。SessionFactory通常在应用...

    Hibernate的事务管理.doc

    本文将详细探讨Hibernate中的事务管理机制及其应用。 【正文】: 1. 事务的四大特性(ACID) - 原子性(Atomicity):事务中的所有操作被视为一个不可分割的单元,要么全部成功,要么全部失败。如果事务中的某...

Global site tag (gtag.js) - Google Analytics