`

hibernate的事务管理

 
阅读更多

在讲解hibernate的事物管理之前,我们必须首先明白一些基本的概念,以此帮助理解,为什么要事物管理这个东西,有它之后有什么用,它有哪些基本特性或者限制,

那么第一点,我们该知道的就是事物的4个基本特性,也就是我们常说的ACID【原子性,一致性,隔离性,持久性】;

第二点,应该知道的是,事物的隔离级别,即通过某种机制,在并发运行的多个事物之间进行分隔,使其保持执行时的独立性。一般分为Read Uncommitted, Read Committed , Repeatable Read, Serializable这四个隔离级别,这四种隔离级的严密程度是一次递增的,同事它的性能也是依次下降,在脏读取,不可重读,和虚读,这三个中数据库可能出现漏洞的情况下,这四个级别采取的应对措施是不同的,也就是说,这四个隔离级下,这三种情况发生的可能性是,1.可能脏读,可能重读,可能虚读;2.不可能脏读,可能重读,可能虚读; 3.不可能脏读,不可能重读,可能虚读 4.三种漏洞全都不可能发生。所以日常使用时,需根据实际情况取舍,以保持系统的最佳平衡。

hibernate是jdbc轻量级的封装,本身不具备事务管理的能力,在事物管理层面,一般是委托于底层的jdbc和jta来完成调度的。默认事物处理机制是基于jdbc transaction的,当然,我们也能通过配置jta来实现:

Xml代码
  1. <hibernate-configuration>
  2. <session-factory>
  3. ........
  4. <propertyname="hibernate.transaction.factory_class">
  5. net.sf.hibernate.transaction.JTATransactionFactory//JTA
  6. <!--net.sf.hibernate.transaction.JDBCTransactionFactory-->//JDBC
  7. </property>
  8. ........
  9. </sesssion-factoty>
  10. </hibernate-configuration>

将事物委托给jdbc处理,无疑是最简单的方式,hibernate支持它做默认方式,其事物的封装,也非常简单,比如当我们在处理这段代码时:

Java代码
  1. session=sessionFactory.openSession();
  2. Transactiontx=session.beginTransaction();
  3. ......
  4. tx.commit();

而从jdbc事物层面而言,实际上做的是:

Java代码
  1. Connectiondbconn=getConnection();
  2. dbconn.setAutoCommit(false);
  3. ......
  4. dbconn.commit();

就这么简单,换了个说法,把hibernate的提交方式,在底层用原生的jdbc进行了提交,这里需要注意的是在openSession()的时候,底层的jdbc的AutoCommit属性已被关闭了,除非jdbc连接去commit,否则执行的操作将不会对数据库产生任何效果,这里那就需要我们去显示执行tx.commit()了[非事物性数据库除外,如Mysql ISam]

而JTA与jdbc的事物的最大差异,在于它提供了跨session的事物管理能力。jdbc事物由Connection管理,事物的周期限于Connection的生命周期。而JTA则由JTA容器实现,容器可对当前的众多Connection进行调度,于是它可横跨多个Connection生命周期,于是也提供了跨session的能力。

比如我们下面这段代码,在jdbc的事物下完全正确的,但是在jta下就会产生问题:

Java代码
  1. classClassA{
  2. publicvoidsave(Useruser){
  3. Sessionsession=sessionFactory.openSession();
  4. Transactiontx=session.beginTransaction();
  5. session.save(user);
  6. tx.commit();
  7. session.close();
  8. }
  9. }
Java代码
  1. <preclass="java"name="code">classClassB{
  2. publicvoidsave(Orderorder){
  3. Sessionsession=sessionFactory.openSession();
  4. Transactiontx=session.beginTransaction();
  5. session.save(order);
  6. tx.commit();
  7. session.close();
  8. }
  9. }</pre>
  10. classClassC{
  11. publicvoidsave(){
  12. .....
  13. UserTransactiontx=(UserTranscation)(newInitialContext().lookup("...."));
  14. ClassA.save(user);
Java代码
  1. ClassB.save(oreder);
  2. tx.commit();
  3. ......
  4. }
  5. }

这里的问题是,ClassA和B调用了hibernate的Transaction功能。而在hibernate的JTA分装中,Session.beginTransaction同样也执行了InitialContext.lookup去获得UserTransaction的实例,而在tx.commit的时候,ClassA和B都企图声明自己的事物,从而导致错误,因为我们知道,jdbc的事物,是不能够跨connection,跨session的。而假使使用jta,那么我们则可以修改上面代码,实现操作:

Java代码
  1. classClassA{
  2. publicvoidsave(Useruser){
  3. Sessionsession=sessionFactory.openSession();
  4. session.save(user);
  5. session.close();
  6. }
  7. }
  8. classClassB{
  9. publicvoidsave(Orderorder){
  10. Sessionsession=sessionFactory.openSession();
  11. session.save(order);
  12. session.close();
  13. }
  14. }
  15. classClassC{
  16. publicvoidsave(){
  17. .....
  18. Sessionsession=sessionFactory.openSession();
  19. Transactiontx=session.beginTransaction();
  20. ClassA.save(user);
  21. ClassB.save(order);
  22. tx.commit();
  23. session.close();
  24. }
  25. }
在EJB中使用JTA Transaction无疑最为简单,我们只需要将save方法的属性声明为Required,Ejb容器就会自动的维护并执行过程中的事物。

分享到:
评论

相关推荐

    hibernate事务管理机制.doc

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

    spring hibernate 事务管理学习笔记(一)

    本文将深入探讨Spring与Hibernate整合时的事务管理,帮助你更好地理解和运用这些技术。 首先,Spring框架是Java企业级应用的基石,它提供了一种依赖注入(Dependency Injection,DI)的方式,使得组件之间的耦合度...

    spring hibernate 事务管理学习笔记(二)

    在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...

    hibernate 事务管理注意事项

    ### hibernate 事务管理注意...综上所述,Hibernate事务管理的合理配置对于保证系统的稳定性和数据一致性至关重要。开发者应该充分了解Hibernate的缓存机制及其对事务管理的影响,并根据实际情况灵活调整事务管理策略。

    Spring Hibernate事务实例

    2. Hibernate事务管理:使用`HibernateTransactionManager`结合SessionFactory进行事务控制。 3. AOP(面向切面编程)在事务管理中的应用:`TransactionInterceptor`基于AOP拦截方法调用,处理事务。 4. 配置事务...

    Spring Hibernate 事务处理 详细说明

    1. **Hibernate事务管理:** - Session API:Hibernate的Session对象是操作数据库的基本单元,它支持begin、commit和rollback等事务操作。 - Transaction API:Hibernate的Transaction接口提供了更高级别的事务...

    在Spring中配置Hibernate事务

    在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...

    hibernate事务管理

    在Hibernate中,事务管理主要分为两种模式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**: 在编程式事务管理中,开发者需要手动开始、提交、回滚事务。这通常通过`Session`对象的`beginTransaction()...

    Spring+Hibernate事务管理

    Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...

    Hibernate事务(源码)

    **Hibernate事务管理详解** 在Java开发中,尤其是在企业级应用中,事务管理是不可或缺的一部分。Hibernate作为一款流行的ORM(对象关系映射)框架,提供了强大的事务处理能力。本篇文章将深入探讨Hibernate中的事务...

    hibernate事务,并发及缓存管理实例

    一、Hibernate事务管理 在数据库操作中,事务确保了数据的一致性和完整性。Hibernate提供了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化...

    spring mvc+hibernate实现事务管理(配置文件版)

    本项目是关于如何使用Spring MVC与Hibernate结合来实现事务管理的实践教程,通过MyEclipse自动生成所需的包和配置文件。这里将详细讲解这一过程,以及涉及到的关键知识点。 首先,Spring MVC作为Spring框架的一部分...

    spring,hibernate整合实现事务管理(MethodInterceptor)

    2. **Hibernate事务管理**: - Hibernate提供了`Session`和`SessionFactory`,它们是与数据库交互的主要对象。`Session`负责单个数据库会话,而`SessionFactory`在整个应用程序生命周期中只创建一次,用于生成`...

    hibernate事务

    Hibernate事务管理是Java开发中非常重要的一个环节,尤其是在企业级应用开发中,它与数据库的交互密切相关,确保数据的一致性和完整性。Hibernate作为一款流行的ORM(对象关系映射)框架,提供了一种方便的方式来...

    Spring AOP管理Hibernate事务(TransactionInSpringAOP)

    本篇文章将深入探讨如何在Spring AOP中实现Hibernate事务管理,以及这一过程中的关键概念和技术细节。 首先,让我们了解什么是Spring AOP。AOP是一种编程范式,它允许程序员定义“切面”,这些切面是跨越多个对象的...

    Hibernate事务

    Hibernate 事务管理是 ORM 框架中的重要组成部分,它负责确保数据操作的一致性和完整性。在 Hibernate 中,事务管理可以基于 JDBC Transaction 或 JTA (Java Transaction API) 进行,这两种方式各有特点。 首先,...

    Could not roll back Hibernate transaction.doc

    这种情况可能是由于开发人员手动执行了数据库操作,而没有使用Hibernate提供的API,这将导致Hibernate事务管理机制失效。 三、解决方法 要解决该问题,可以采取以下步骤: 1. 重启服务器:这是最简单的解决方法,...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    二、Hibernate事务管理 Hibernate本身也支持事务管理,但通常与Spring集成时,我们使用Spring的事务管理。`HibernateTransactionManager`是Spring提供的专门用于管理Hibernate事务的类,它会自动处理Hibernate ...

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

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

    详解Hibernate事务处理机制

    ### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...

Global site tag (gtag.js) - Google Analytics