`

Hibernate事物控制与管理

阅读更多
   数据库事务必须具备ACID的特征(Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性)数据库操作过程中可能出现的3种不确定情况:
    1. 脏读取(Dirty Reads):一个事务读取了另一个并行事务未提交的数据。
    2. 不可重复读取(Non-repeatable Reads):一个事务再次读取之前的数据时,得到的数据不一致,被另一个已提交的事务修改。
    3. 虚读(Phantom Reads):一个事务重新执行一个查询,返回的记录中包含了因为其他最近提交的事务而产生的新记录。
    标准SQL规范中,为了避免上面3种情况的出现,定义了4个事务隔离等级:
    1. Read Uncommitted:最低等级的事务隔离,仅仅保证了读取过程中不会读取到非法数据。上诉3种不确定情况均有可能发生。
    2. Read Committed:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
    3. Repeatable Read:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
    4. Serializable:最高等级的事务隔离,上面3种不确定情况都将被规避。这个级别将模拟事务的串行执行。
   
一、Hibernate事物控制
    Hibernate为了避免脏读、泛读、不可重复读等可能会违背数据ACID原则的操作设置了两套策略对事物进行控制(一般结合使用):
    1、在Hibernate配置文件中设置隔离级别(从宏观上控制)
    JDBC连接数据库使用的是默认隔离级别,即读操作已提交(Read Committed)和可重读(Repeatable Read)。在Hibernate的配置文件hibernate.properties中,可以修改隔离级别:
   
hibernate.connection.isolation 4

    也可以在配置文件hibernate.cfg.xml中加入以下代码:
    
<session-factory>
  ……         
   //把隔离级别设置为4
  <property name="hibernate.connection.isolation">4</property>
</session-factory>

     Hibernate事务的隔离级别的数字意义如下。
    
1:读操作未提交(Read Uncommitted)
2:读操作已提交(Read Committed)
4:可重读(Repeatable Read)
8:可串行化(Serializable)

    2、在代码上提供两种锁机制:悲观锁机制与乐观锁机制(从微观上控制)

二、Hibernate事物管理
  Hibernate是JDBC的轻量级封装,本身并不具备事务管理能力,在事务管理层Hibernate将其委托给底层的JDBC或者JTA,以实现事务的管理和调度.
  Hibernate的默认事务处理机制基于JDBCTransaction,也可以通过配置文件设定采用JTA作为事务管理实现:
  <hibernate-configuration> 
        <session-factory> 
    …… 
             <property name = "hibernate.transaction.factory_class"> 
               net.sf.hibernate.transaction.JTATransactionFactory 
             </property>
    </session-factory> 
   </hibernate-configuration> 

1、基于JDBC的事务管理
   Hibernate对于JDBC事务的封装非常简单。例如:
   public void saveUser(){
     Session session = sessionFactory.openSession();
     Transaction tx = session.beginTransaction();
     session.save(user);
     tx.commit();
     session.close();
   }
   必须在session.close()之前commit或者rollback

   这里要注意的是,在sessionFactory.openSession()中,Hibernate会初始化数据库连接,与此同时,将其 AutoCommit设为关闭状态,这就是说,从SessionFactory获得的session其自动提交属性就已经被关闭了,下面的代码不会对事务性数据库产生任何效果。
session=sessionFactory.openSession(); 
   session.save(user); 
   session.close(); 

   如果要使得代码真正作用到数据库,必须显示的调用Transaction指令提交事物

2、基于JTA的事务管理
   JTA提供了跨Session的事务管理能力,这是与JDBCTransaction最大的差异。
public void saveUser(){
     Session session = sessionFactory.openSession();
     Transaction tx = session.beginTransaction();
    
     session.save(user);
     session.close();
    
     Session session1 = sessionFactory.openSession();
     session1.save(user1);
     session.close();
    
     tx.commit();
}
  commit和rollback可以在session.close()之后执行.同时应该注意的一点是,事务是不能嵌套的,在使用jta的事务的情况下,如果要让一个事务跨越两个session,则必须在两个session的外层开始事务和完成事务。而不能再在session内部开始事务和完成事务。

   JDBC 事务由Connection管理,也就是说,事务管理实际上是在JDBC Connection中实现,事务周期限于Connection生命周期之内,对于基于JDBC Transaction的Hibernate事务管理机制,事务管理在Session所依托的JDBC Connection中实现,事务周期限于Session的生命周期。
   JTA事务管理由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度,实现其事务性要求,JTA的事务周期可横跨多个JDBC Connection生命周期,同样,对基于JTA事务的Hibernate,JTA事务横跨多个Session。需要注意的是,参与JTA事务的 Connection需避免对事务管理进行干涉,如果采用JTA Transaction,就不应该再调用Hibernate的Transaction功能。

   特别注意:如果使用了JTA事务,则不能再用在JDBC式的事务来管理每个Session的操作,否则会出错。为了程序的的通用性,一般来说,都是使用 JTA事务来构建应用,这使用任何环境。当然,也可以使用事务代理为每个JDBC的操作方法加入事务控制。这样也为程序以后移植到JTA容器事务上带来很大方便。其实现在可以使用Spring的事务管理,与Hibernate结合的非常完美。   
*****************************************   
hibernate配置正确的情况下:   
    
      在服务层上:   
                  一:如果通过HibernateDaoSupport来getSession  那么 这个session当一个方法结束的时候 就关闭了   
                  二:如果通过HibenateDAOSupport 来getSessionFactory在opensession()那么就是   方法结束后不会关闭session需要自己手动的关闭   
                  三:如果采用的是HibernateTemplate的hbiernatecallback 里面的session是当do..方法结束 就关闭session(不代表 马上就提交事务 这里以后讨论)   
    
  如果 没有配置正确:包括改业务逻辑 没有被spring的事务控制控制 则 上诉 不适用  

分享到:
评论

相关推荐

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

    通过实例你也许会明白hibernate事务,并发及缓存管理的运行原理,如果对这个感兴趣的可以看看

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

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

    NULL 博文链接:https://88548886.iteye.com/blog/1528486

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

    NULL 博文链接:https://beisicao.iteye.com/blog/995650

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring + Hibernate + Struts 事务配置小例子(带提示框等小技巧)

    今天修改了 applicationContext.xml,以后的事务控制就万事大吉了,里面有详细注释哦。 有什么问题可以给我留言 ^_^,大家一起进步! &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Hibernate+中文文档

    3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. ...

    第24次课-1 Spring与Hibernate的整合

    持久层访问必需的事务控制 24.1 概述 24.1.1 概述 Spring的管理方式: 将DataSource、SessionFactory、Transaction等作为Spring的Bean,通过配置文件的方式来管理。 24.1 概述 24.1.1 概述 Spring提供了DAO支持,...

    图书管理系统(struts+hibernate+spring)130225.rar

    此外,Spring框架的引入为系统带来了一系列企业级的服务,如事务管理、安全性控制等,这些服务的配置和管理都通过Spring的IoC容器优雅地解决,进一步保障了系统的稳定运行和数据一致性。整体而言,这个图书管理系统...

    会员管理系统(struts+hibernate+spring)130226.rar

    Spring框架在整个系统中起到了粘合剂的作用,它将Struts和Hibernate框架整合在一起,实现了依赖注入和事务管理等功能。通过Spring的配置,开发人员可以方便地对各个组件进行管理和控制,提高了系统的

    hibernate3.2中文文档(chm格式)

    3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. ...

    HibernateAPI中文版.chm

    3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     20.5 Java应用通过Hibernate API声明JDBC事务  20.5.1 处理异常  20.5.2 Session与事务的关系  20.5.3 设定事务超时  20.6 Java应用通过Hibernate API声明JTA事务  20.7 Java应用通过JTA API声明JTA事务  ...

    hibernate 教程

    乐观并发控制(Optimistic concurrency control) 10.4.1. 使用长生命周期带有自动版本化的会话 10.4.2. 使用带有自动版本化的多个会话 10.4.3. 应用程序自己进行版本检查 10.5. 会话断开连接(Session...

    Hibernate实战(第2版 中文高清版)

     10.3.2 使用Hibernate非事务地工作   10.3.3 使用JTA的可选事务   10.4 小结   第11章 实现对话   11.1 传播Hibernate Session   11.1.1 Session传播的用例   11.1.2 通过线程局部传播   11.1.3 ...

    图书管理系统(struts+hibernate+spring).rar

    而Spring框架则提供了一系列的企业级服务,如事务管理、依赖注入等,使得整个系统更加健壮、易于测试和部署。在这个资料包中,用户将会找到一个基于这三个框架的图书管理系统的完整源代码,包括了前端页面、控制器、...

    Spring_Hibernate使用TransactionInterceptor声明式事务配置.doc

    在这篇文章中,我们将探讨使用Spring_Hibernate框架实现声明式事务配置的方法,具体来说,就是使用TransactionInterceptor来管理事务。在Spring框架中,事务管理器是核心组件之一,它负责管理事务的生命周期,包括...

    vip会员登录系统结合spring + mvc +hibernate

    其中包含apache的log4j记录日志信息,spring管理组件,springmvc分层,springaop配置数据库事务控制,hibernate二级缓存配置,实现了查询,用户登录注册,请求验证是否登录等基础功能Demo,基于后台测试,使用前台...

Global site tag (gtag.js) - Google Analytics