hibernate 事务管理
2017-03-31 10:51
246 查看
1 什么是事务管理
事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰。作为一名软件设计师,必须了解事务并合理利用,以确保数据库保存正确、完整的数据。数据库向用户提供保存当前程序状态的方法,叫事务提交(commit);当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫事务回滚(rollback)。2 事务的特性
原子性(Atomicity)一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
简称ACID。下面对这4个特性分别进行说明。
原子性:将事务中所做的操作捆绑成一个原子单元,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态,而且在相关数据中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应该是正确的。
隔离性:由并发事务所做的修改必须与任何其他事务所做的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即事务不会查看由另一个并发事务正在修改的数据。这种隔离方式也叫可串行性。
持久性:事务完成之后,它对系统的影响是永久的,即使出现系统故障也是如此。
3 事务隔离
脏读(Dirty Read)不可重读(Unrepeatable read)
幻读(Phantom Read)
脏数据(Dirty Read):如果第二个应用程序使用了第一个应用程序修改过的数据,而这个数据处于未提交状态,这时就会发生脏读。第一个应用程序随后可能会请求回滚被修改的数据,从而导致第二个事务使用的数据被损坏,即所谓的“变脏”。
不可重读(Unrepeatable Read):一个事务两次读同一行数据,可是这两次读到的数据不一样,就叫不可重读。如果一个事务在提交数据之前,另一个事务可以修改和删除这些数据,就会发生不可重读。
幻读(Phantom Read):一个事务执行了两次查询,发现第二次查询结果比第一次查询多出了一行,这可能是因为另一个事务在这两次查询之间插入了新行。
针对由事务的不完全隔离所引起的上述问题,提出了一些隔离级别,用来防范这些问题。
读操作未提交(Read Uncommitted)1级:说明一个事务在提交前,其变化对于其他事务来说是可见的。这样脏读、不可重读和幻读都是允许的。当一个事务已经写入一行数据但未提交,其他事务都不能再写入此行数据;但是,任何事务都可以读任何数据。这个隔离级别使用排写锁实现。
读操作已提交(Read Committed)2级:读取未提交的数据是不允许的,它使用临时的共读锁和排写锁实现。这种隔离级别不允许脏读,但不可重读和幻读是允许的。
可重读(Repeatable Read)4级:说明事务保证能够再次读取相同的数据而不会失败。此隔离级别不允许脏读和不可重读,但幻读会出现。
可串行化(Serializable)8级:提供最严格的事务隔离。这个隔离级别不允许事务并行执行,只允许串行执行。这样,脏读、不可重读或幻读都可发生。
在一个实际应用中,开发者经常不能确定使用什么样的隔离级别。太严厉的级别将降低并发事务的性能,但是不足够的隔离级别又会产生一些小的Bug,而这些Bug只会在系统重负荷(也就是并发严重时)的情况下才会出现。
一般来说,读操作未提交(Read Uncommitted)是很危险的。一个事务的回滚或失败都会影响到另一个并行的事务,或者说在内存中留下和数据库中不一致的数据。这些数据可能会被另一个事务读取并提交到数据库中。这是完全不允许的。
另外,大部分程序并不需要可串行化隔离(Serializable Isolation)。虽然,它不允许幻读,但一般来说,幻读并不是一个大问题。可串行化隔离需要很大的系统开支,很少有人在实际开发中使用这种事务隔离模式。
现在留下来的可选的隔离级别是读操作已提交(Read Committed)和可重读(Repeatable Read)。Hibernate可以很好地支持可重读(Repeatable Read)隔离级别。
4 在Hibernate配置文件中设置隔离级别
hibernate.properties中,可以修改隔离级别,应把此语句行前的注释符“#”去掉:#hibernate.connection.isolation 4
hibernate.cfg.xml中加入以下代码,把隔离级别设置为4:
<property name=” hibernate.connection.isolation”>4</property>
mysql的事物级别是4。在开始一个事务之前,Hibernate从配置文件中获得隔离级别的值。
5 事务规范代码
public class UserTrans { @Test public void testTx(){ SessionFactory sessionFactory=null; Session session=null; Transaction tx=null; try { sessionFactory=UserUntil.getSessionFactory(); session=sessionFactory.openSession(); //开始事务 //添加 tx=session.beginTransaction(); User user=new User(); user.setUsername("qqqqeww"); user.setPassword("12345"); session.save(user); //提交事务 tx.commit(); } catch (Exception e) { tx.rollback(); }finally{ session.close(); sessionFactory.close(); } } }
参考:
http://blog.csdn.net/lifaming15/article/details/2564660
相关文章推荐
- Hibernate事务管理中的默认形式
- Hibernate的事务管理
- Spring和hibernate多个数据源的事务管理
- 用spring管理hibernate事务时,lzay="true"不能用的解决方法
- 四、hibernate实体对象,事务管理,锁
- spring对hibernate提供的事务管理的一个实用的例子
- 纯JDBC、Hibernate、Spring的AOP声明式事务管理小结
- 编程式事务管理、声明式事务管理中HibernateDaoSupport与JdbcDaoSupport的应用
- 解决一个Sping管理hibernate时的事务问题(No Hibernate Session bound to thread)
- Spring和Hibernate的结合--声明式事务管理(转)
- Hibernate的数据库事务管理
- Spring管理hibernate的事务的方法
- Hibernate的两种事务管理jdbc 和jta方式
- hibernate的两种事务管理jdbc 和jta方式
- spring+hibernate中的事务管理
- spring管理hibernate事务
- Spring 中基础配置和事务管理的配置和spring托管hibernate配置文件的方法
- spring hibernate 事务管理
- Spring中事务管理与Hibernate自带事务管理冲突的一个问题
- Spring学习总结9(基于Hibernate的事务管理)