zoukankan      html  css  js  c++  java
  • Hibernate 事务管理

    一. 事务包含四个基本特性:简称ACID:

    1. Atomic(原子性):全部成功或全部失败;

    2. Consistency(一致性):只有合法数据才能被写入,不合法则回滚到最初状态;

    3. Isolation(隔离性):允许并发,并发的事务相互独立;

    4. Durability(持久性):事务结束后,结果能保存;


    二. 数据库事务管理隔离等级

    数据库操作过程中经常出现三种不确定情况:

    1. 脏读取(Dirty Reads):一个事务读取了另一个并行事务未提交的数据;

    2. 不可重复读取(Non-repeatable Reads):一个事务再次读取曾读取过的数据时,发现该数据已经被另一个提交的事务修改;

    3. 虚读(Phantom Reads):一个事务重新执行一个查询,返回一套符合查询条件的记录,但这些记录中包含了因为其他最近提交的事务而产生的新记录;


    为避免以上三种情况,定义了如下四种事务隔离等级:

    隔离等级 脏读取 不可重复读取 虚读
    Read Uncommitted 可能 可能 可能
    Read committed 不可能 可能 可能
    Repeatable Read 不可能 不可能 可能
    Serialiazble 不可能 不可能 不可能

    这四种事务隔离等级的严密程度由前往后依次递增,同时,其性能也依次下降。


    三. 事务管理概述

    Hibernate 是 JDBC 的轻量级封装,本身并不具备事务管理能力。在事务管理层,Hibernate 将其委托给底层的JDBC或者JTA,以实现事务的管理和调度。

    1. 基于JDBC的事务管理

    看以下代码:

    session = sessionFactory.openSession();

    Transaction tx = session.beginTransaction();

    ......

    tx.commit();

    这里要注意的是,在 sessionFactory.openSession()中,Hibernate 会初始化数据库连接,与此同时,将其AutoCommit设为关闭状态(false).而其后,在Session.beginTransaction方法 中,Hibernate 会再次确认 Connection 的 AutoCommit属性被设为关闭状态(为了防止用户代码对session的Connection.AutoCommit属性进行修改)。

    这也就是说,我们一开始从SessionFactory 获得的session, 其自动提交属性就已经被关闭(AutoCommit=false),下面的代码将不会对事务性数据库产生任何效果(非事务性数据库除外,如Mysql ISAM):

    session = sessionFactory.openSession();

    session.save(user);

    session.close();

    这实际上相当于JDBC Connection的AutoCommit属性被设为false,执行了若干JDBC操作之后,没有调用commit操作即将Connection关闭。


    要使用代码真正作用到数据库,我们必须显式地调用Transaction指令:

    session = sessionFactory.openSession();

    Transaction tx = session.beginTransaction();

    session.save(user);

    tx.commit();

    session.close();

    2. 基于JTA的事务管理

    JTA提供了跨Session的事务管理能力。这一点是与JDBC Transaction最大的差异。

    JDBC 事务由Connection管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期之类。

    JTA事务管理则由JTA容器实现,JTA容器对当前加入事务的众多 Connection进行调度,实现其事务性要求。JTA的事务周期可横跨多个JDBC Connection生命周期。同样对于基于JTA事务的Hibernate而言,JTA事务横跨多个Session.

    JTA事务是由JTA Container维护的,事务的生命周期由JTA Container维护,而与具体的Connection无关。

    这里需要注意的是,参与JTA事务的Connection需避免对事务管理进行干涉。这也就是说,如果采用JTA Transaction,我们就不应该再调用 Hibernate 的 Transaction功能。

  • 相关阅读:
    透过WebGL 3D看动画Easing函数本质
    vmware虚拟机Windows 2003上网问题
    JAVA多态学习2
    h5播放音乐
    Unity3D:粒子系统Particle System
    文章标题
    【面试加分项】java自己定义注解之申明注解
    osgi实战学习之路:1. ant+bnd+felix搭建osgi之HelloWorld
    Android简单实现Socket通信,client连接server后,server向client发送文字数据
    句子开头
  • 原文地址:https://www.cnblogs.com/dingjiaoyang/p/5317158.html
Copyright © 2011-2022 走看看