一. 事务包含四个基本特性:简称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功能。

Hibernate 事务管理的更多相关文章

  1. hibernate事务管理 (jdbc jta)

    hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...

  2. (转)Hibernate事务管理

    Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...

  3. Spring对Hibernate事务管理

    谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中 我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...

  4. Spring与Hibernate整合,实现Hibernate事务管理

    1.所需的jar包 连接池/数据库驱动包 Hibernate相关jar Spring 核心包(5个) Spring aop 包(4个) spring-orm-3.2.5.RELEASE.jar     ...

  5. Hibernate事务管理

    User类: public class User implements Serializable{ public User(){} private Integer id; private String ...

  6. Spring对Hibernate事务管理【转】

    在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...

  7. Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理

    由于对SSH还停留在比较初级的应用水平上,今天在遇到一个疑惑时折腾了很久,具体问题是这样的, 有这么一个测试方法, public static void test1() { ApplicationCo ...

  8. Spring中配置Hibernate事务管理

    <!-- transationManager --> <bean id="transactionManager" class="org.springfr ...

  9. Hibernate框架笔记02_主键生成策略_一级缓存_事务管理

    目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...

随机推荐

  1. Open Audio Library

    Open Audio Library OPENAL是一个音效API,负责系统和声卡之间的沟通,几乎没有一个API能达到她的全部潜能.由 Creative公司.nvidia公司 和 Loki工作室 发起 ...

  2. MySQL 函数大全

    mysql函数大全 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NU ...

  3. 58同城高性能移动Push推送平台架构演进之路

    本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问 ...

  4. 【SQL】CLR聚合函数什么鬼

    之前写过一个合并字符串的CLR聚合函数,基本是照抄MS的示例,外加了一些处理,已经投入使用很长时间,没什么问题也就没怎么研究,近日想改造一下,遇到一些问题,遂捣鼓一番,有些心得,记录如下. 一.杂项 ...

  5. python的metaclass

    元类一般用于创建类.在执行类定义时,解释器必须要知道这个类的正确的元类.解释器会先寻找类属性__metaclass__,如果此属性存在,就将这个属性赋值给此类作为它的元类.如果此属性没有定义,它会向上 ...

  6. UITextView 文本垂直居中

    var center=textView.Bounds.Size.Height - textView.ContentSize.Height; center = center < ? : cente ...

  7. Document

    每个载入浏览器的 HTML 文档都会成为 Document 对象.Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问.提示:Document 对象是 Window 对象的一 ...

  8. hibernate 注释说明

    * @Entity -- 将一个类声明为一个实体 bean(即一个持久化 POJO 类) * @Id -- 注解声明了该实体 bean 的标识属性(对应表中的主 键). * @Table -- 注解声 ...

  9. 世界那么Big,组件那么Small

    推荐一个跨平台模块化App框架 -Small. Small,做最轻巧的跨平台插件化框架. 功能 完美内置 所有插件支持内置于宿主包中 高度透明 插件编码.布局编写方式与独立应用开发无异 插件代码调试与 ...

  10. ASP.NET MVC进阶三

    一.ASP.NET MVC中的AJAX应用 首先,在ASP.NET MVC中使用自带的ajax功能,必须要导入2个js文件(顺序不能颠倒): ASP.NET MVC提供了2个常用的ajax辅助方法. ...