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. ...
随机推荐
- 【c#搬砖记】用Docx导出word格式的docx文件
DocX开源网址:http://docx.codeplex.com/ 1.引入DocX.dll 调用ReplaceText()方法替换模板中的字符.只支持docx格式的word文档 using (Do ...
- C#利用浏览按钮获得文件路径和文件夹路径
生成文件夹路径 private void btnChoose_Click(object sender, EventArgs e) { using (OpenFileDialog ...
- Stream/Bytes[]/Image对象相互转化
Stream/Bytes[]/Image对象相互转化 Stream转Byte数组.Image转Byte数组.文件转Stream等 /// <summary> /// 将 Stream 转成 ...
- 360手机卫士会影响Widget的运行
最近开发了一个Widget,老是运行时间长了就会出现NullPointerException错误,一直不知道是什么原因造成的,后来把Widget加入360一键清理的保护名单,错误就少很多,但是仍然有错 ...
- mysql 增、删、改、查 、函数、执行次序
这些是最基础的部分,若果这些不能满足你的需求,可以到http://www.w3school.com.cn中查询 增删改: 增 insert into<表名>(<列名列表>(如果 ...
- GC之详解CMS收集过程和日志分析
2016-08-23 关于GC的算法和垃圾收集器的种类就暂且不说了,网上有大把的资料供参考 话题引入 让我们先简单的看下整个堆年轻代和年老代的垃圾收集器组合(以下配合java8完美支持,其他版本可 ...
- ahjesus 单词单数-复数相互转换C#
看codesmith内置的模板在生成存储过程的时候有单复数的转换,用相同的函数名实现了一个 public static class StringUtil { /// <summary> / ...
- HTTP错误大全 404 200 501 502 505
HTTP错误 大全 403 401 400 404 304 200 HTTP 400 - 请求无效 HTTP 401.1 - 未授权:登录失败 HTTP 401.2 - 未授权:服务器配置问题导致登录 ...
- JS复杂对象克隆
之前一直比较习惯用Ext.apply()方法来实现对象的克隆,今天遇到一个问题,当对象中含有数组,且数组中包含复杂类型时,Ext.apply()的克隆就有问题了. 于是就想着试试自己能不能解决.在网上 ...
- 15款免费的响应式 WordPress 主题下载
响应式设计主题最适合杂志网站,博客网站,想要在自己网站上展示自己作品的用户.支持视网膜显示使其在 iPad,iPhone,Mackbook,iMac 等设备上有更高的分辨率. 响应式和现代设计风格的多 ...