Hibernate 事务管理
来源:互联网 发布:2017mac pro玩魔兽世界 编辑:程序博客网 时间:2024/05/17 01:30
一. 事务包含四个基本特性:简称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事务管理
- Hibernate事务管理
- Hibernate事务管理
- hibernate-事务管理
- hibernate-事务管理
- Hibernate事务管理
- hibernate-事务管理
- Hibernate事务管理
- Hibernate事务管理
- Hibernate 事务管理
- Hibernate事务管理
- Hibernate事务管理
- Hibernate事务管理
- Hibernate事务管理
- hibernate-事务管理
- hibernate事务管理
- Hibernate事务管理
- 06 黑白棋
- 指针与引用(C++)
- android屏幕适配 - 切图
- hibernate配置文件hibernate.cfg.xml的详细解释
- Cross Site Tracing (XST) Attacks(跨站跟踪攻击)练习详细步骤(WebGoat5.4)
- Hibernate 事务管理
- Java中keySet()返回值的排序问题
- zzuli OJ 1043: 最大值
- 定向输出NSLog 到沙盒路径下
- 如何处理iOS中照片的方向
- update 用法
- Kafka 设计与原理详解
- 《天谕》全新PBR技术曝光 布料纹路清晰可见
- ios开发之 复制字符串到剪贴板