Hibernate的事务管理
2019独角兽企业重金招聘Python工程师标准>>>
事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰。作为一名软件设计师,必须了解事务并合理利用,以确保数据库保存正确、完整的数据。数据库向用户提供保存当前程序状态的方法,叫事务提交(commit);当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫事务回滚(rollback)。
1 事务的特性
事务具备原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)4个属性,简称ACID。下面对这4个特性分别进行说明。
原子性:将事务中所做的操作捆绑成一个原子单元,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态,而且在相关数据中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应该是正确的。
隔离性:由并发事务所做的修改必须与任何其他事务所做的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即事务不会查看由另一个并发事务正在修改的数据。这种隔离方式也叫可串行性。
持久性:事务完成之后,它对系统的影响是永久的,即使出现系统故障也是如此。
2 事务隔离
隔 离 级 别 | 脏读(Dirty Read) | 不可重读(Unrepeatable read) | 幻读(Phantom Read) |
读操作未提交(Read Uncommitted) | 可能 | 可能 | 可能 |
读操作已提交(Read Committed) | 不可能 | 可能 | 可能 |
可重读(Repeatable Read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable) | 不可能 | 不可能 | 不可能 |
JDBC连接数据库使用的是默认隔离级别,即读操作已提交(Read Committed)和可重读(Repeatable Read)。在Hibernate的配置文件hibernate.properties中,可以修改隔离级别:
|
在上一行代码中,Hibernate事务的隔离级别是4,这是什么意思呢?级别的数字意义如下。
1:读操作未提交(Read Uncommitted) 2:读操作已提交(Read Committed) 4:可重读(Repeatable Read) 8:可串行化(Serializable)
因此,数字4表示“可重读”隔离级别。如果要使以上语句有效,应把此语句行前的注释符“#”去掉:
|
也可以在配置文件hibernate.cfg.xml中加入以下代码:
|
在开始一个事务之前,Hibernate从配置文件中获得隔离级别的值。
Hibernate对JDBC进行了轻量级的封装,它本身在设计时并不具备事务处理功能。Hibernate将底层的JDBCTransaction或JTATransaction进行了封装,再在外面套上Transaction和Session的外壳,其实是通过委托底层的JDBC或JTA来实现事务的处理功能的。
要在Hibernate中使用事务,可以在它的配置文件中指定使用JDBCTransaction或者JTATransaction。在hibernate.properties中,查找“transaction.factory_class”关键字,得到以下配置:
|
Hibernate的事务工厂类可以设置成JDBCTransactionFactory或者JTATransactionFactory。如果不进行配置,Hibernate就会认为系统使用的事务是JDBC事务。
在JDBC的提交模式(commit mode)中,如果数据库连接是自动提交模式(auto commit mode),那么在每一条SQL语句执行后事务都将被提交,提交后如果还有任务,那么一个新的事务又开始了。
Hibernate在Session控制下,在取得数据库连接后,就立刻取消自动提交模式,即Hibernate在一个执行Session的beginTransaction()方法后,就自动调用JDBC层的setAutoCommit(false)。如果想自己提供数据库连接并使用自己的SQL语句,为了实现事务,那么一开始就要把自动提交关掉(setAutoCommit(false)),并在事务结束时提交事务。
使用JDBC事务是进行事务管理最简单的实现方式,Hibernate对于JDBC事务的封装也很简单。下面是一个在Hibernate中使用JDBC事务的例子:
|
JTA(Java Transaction API)是事务服务的J2EE解决方案。本质上,它是描述事务接口的J2EE模型的一部分,开发人员直接使用该接口或者通过J2EE容器使用该接口来确保业务逻辑能够可靠地运行。
JTA有3个接口,它们分别是UserTransaction接口、TransactionManager接口和Transaction接口。这些接口共享公共的事物操作,例如commit()和rollback(),但也包含特殊的事务操作,例如suspend()、resume()和enlist(),它们只出现在特定的接口上,以便在实现中允许一定程度的访问控制。
在一个具有多个数据库的系统中,可能一个程序会调用几个数据库中的数据,需要一种分布式事务,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTA事务。下面介绍如何在Hibernate的配置文件中配置JTA事务。在hibernate.properties文件中设置如下(把JTATransactionFactory所在的配置行的注释符“#”取消掉):
|
或者在hibernate.cfg.xml文件中配置如下:
|
下面是一个应用JTA事务的例子:
|
转载于:https://my.oschina.net/chainlong/blog/171167
Hibernate的事务管理相关推荐
- Hibernate事务管理
事务只是一个工作单位(单元). 在这种情况下,如果一个步骤失败,则整个事务失败(称为原子性). ACID属性(原子性,一致性,隔离性和持久性)可以描述事务. Hibernate中的事务接口 在hibe ...
- Spring 事务管理高级应用难点剖析
Spring 事务管理高级应用难点剖析: 第 1 部分 http://www.ibm.com/developerworks/cn/java/j-lo-spring-ts1/index.html htt ...
- Spring 事务管理高级应用难点剖析--转
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...
- Spring JDBC-Spring对事务管理的支持
概述 事务管理关键抽象 Spring事务管理的实现类 Spring JDBC 和MybBatis的事务管理器的配置 JPA的事务管理器的配置 Hibernate的事务管理器的配置 JTA 的事务管理器 ...
- atitit.spring hibernate的事务机制 spring不能保存对象的解决
atitit.spring hibernate的事务机制 spring不能保存对象的解决 sessionFactory.openSession() 不能..log黑头马sql语言.. sessionF ...
- Spring的事务管理难点剖析(1):DAO和事务管理的牵绊
2019独角兽企业重金招聘Python工程师标准>>> 有些人很少使用Spring而不使用Spring事务管理器的应用,因此常常有人会问:是否用了Spring,就一定要用Spring ...
- orm jpa_Spring ORM示例– JPA,Hibernate,事务
orm jpa Welcome to the Spring ORM Example Tutorial. Today we will look into Spring ORM example using ...
- Spring配置事务管理
1. spring 注解事务的配置 <!-- 注册配置事务管理器 --> <bean id="transactionManager" class=&quo ...
- spring事务管理的两种方式
一.注解式事务 1.注解式事务在平时的开发中使用的挺多,工作的两个公司中看到很多项目使用了这种方式,下面看看具体的配置demo. 2.事务配置实例 (1).spring+mybatis 事务配置 &l ...
最新文章
- ​如何设计一个安全可靠的 API 接口?
- 06-Firmware Configuration Framework
- 为表增加字段与拷贝数据到另一个表
- Prototype 字符串
- Android应用开发—通用的GridView网格分割线
- python bokeh 示例_Python bokeh.plotting.figure.arc()用法及代码示例
- MVC4 Filter 验证客户端访问类型(移动端、PC端)
- 京东物流:将连续第10年春节也送货 为坚守岗位一线员工补贴近4亿元
- 第三方监测平台在道路安全管理中的应用
- 利用 WireShark 深入调试网络请求
- 以太坊:用 Solidity 写测试用例
- thinkphp 对接阿里云短信支付,其主要是新版composer对接阿里短信
- czy的后宫5 召集妹子
- 敏捷史话(十三):我被 Facebook 解雇了——Kent Beck
- 《Real-Time Rendering 4th Edition》全文翻译 - 第4章 变换(下)4.5 ~ 4.7
- 蓝桥ROS之f1tenth案例学习与调试(成功)
- 现代企业管理-领导控制及现代企业概论
- 下厨房的内容负责人潘小月演讲
- java单数字随机抽奖特效_jquery输入数字随机抽奖特效的简单实现代码
- 道道通导航linux升级,道道通导航升级2020冬季版
热门文章
- 选择软件测试作为你的职业,一个无经验的大学毕业生,可以转行做软件测试吗?
- 5年前我们摸爬滚打进入测试行业,如今你后悔吗?
- numpy 利用np.std() 计算出现 inf
- always on sql 收缩日志_sql server日志文件过大无法收缩的问题
- javaee怎么做到只有登录才可以进网页_java初学者,应该怎么去学习?(建议收藏)...
- 求cluster的质心坐标
- VGG使用重复元素的网络
- 图像的输入\输出和显示
- matlab的HDLcoder,MATLAB发布新产品模块——Simulink HDL Coder_虚拟与仿真
- linux mysql恢复数据_Mysql数据恢复和备份