码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate 事务管理

时间:2015-08-28 17:44:54      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://blog.csdn.net/u011225629/article/details/48053947

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!