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功能。
Hibernate 事务管理的更多相关文章
- hibernate事务管理 (jdbc jta)
hibernate的两种事务管理jdbc 和jta方式.下边说说两者的区别一.说明一下jdbc和jta方式事务管理的区别:JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBC ...
- (转)Hibernate事务管理
Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...
- Spring对Hibernate事务管理
谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中 我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...
- Spring与Hibernate整合,实现Hibernate事务管理
1.所需的jar包 连接池/数据库驱动包 Hibernate相关jar Spring 核心包(5个) Spring aop 包(4个) spring-orm-3.2.5.RELEASE.jar ...
- Hibernate事务管理
User类: public class User implements Serializable{ public User(){} private Integer id; private String ...
- Spring对Hibernate事务管理【转】
在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...
- Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理
由于对SSH还停留在比较初级的应用水平上,今天在遇到一个疑惑时折腾了很久,具体问题是这样的, 有这么一个测试方法, public static void test1() { ApplicationCo ...
- Spring中配置Hibernate事务管理
<!-- transationManager --> <bean id="transactionManager" class="org.springfr ...
- Hibernate框架笔记02_主键生成策略_一级缓存_事务管理
目录 0. 结构图 1. 持久化类的编写规则 1.1 持久化和持久化类 1.2 持久化类的编写规则 2. 主键生成策略 2.1 主键的分类 2.2 主键生成策略 3. 持久化类的三种状态[了解] 3. ...
随机推荐
- MySQL 复制介绍及搭建
MySQL复制介绍 MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard. M ...
- ASP.NET中Request.RawUrl、Request.Url的区别
如果访问的地址是: http://hovertree.com/guestbook/addmessage.aspx?key=hovertree%3C&n=myslider#zonemenu 那么 ...
- HTML 5 Web 存储
HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储 html5 web sto ...
- Monotype推出基于HTML5的Web字体平台
著名字体公司Monotype近日宣布推出基于HTML5的Web字体平台,设计者可以访问近10万字体的目录. Monotype推出基于HTML5的Web字体平台 Monotype推出基于HTML5的We ...
- 【Java每日一题】20161107
package Nov2016; import java.util.List; public class Ques1107 { public static void main(String[] arg ...
- 最小生成二叉树-prim算法
1.prim算法:一种计算生成最小生成树的方法,它的每一步都会为一棵生长中的树添加一条边. 2.时间复杂度:
- Jpa实体VO使用继承的实体的做法@MappedSuperclass注解的使用
在我们开发一个项目的时候,同城定义实体的时候,都会进行一些抽象,也就是面向对象的一些思想.1比如无论是数据实体还是其他类型的实体都会有id字段2.对于数据实体一般都会有创建人,创建时间,更新人,更新时 ...
- Scalaz(33)- Free :算式-Monadic Programming
在任何模式的编程过程中都无法避免副作用的产生.我们可以用F[A]这种类型模拟FP的运算指令:A是可能产生副作用的运算,F[_]是个代数数据类型ADT(Algebraic Data Type),可以实现 ...
- 今天做项目时,用到了好多关于js的知识点,有的忘记了,然后晚上回来自己整理一番,明天继续整理。哈哈,分享给大家。
javascript 数据类型 typeof (直接量/变量)-------判断数据类型 简单数据类型(栈,空间小,速度快) string字符串 用引号引起来的文本 number数字 所有数字 NaN ...
- ContentTools – 所见即所得(WYSIWYG)编辑器
Content Tools是一个用于构建所见即所得编辑器(WYSIWYG)的 JavaScript 库.ContentTools 所见即所得的编辑器只需要几个简单的步骤就可以加入到任何的 HTML 页 ...