您的位置:首页 > 其它

hibernate事务管理

2016-06-15 20:43 183 查看
事务的特性

1. 原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行

2. 一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。

3. 隔离性(isolation),由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。

4. 持久性(Duration),事务完成之后,它对于系统的影响是永久性的。

注:事务的ACID特性是由关系数据库管理系统(RDBMS)来实现的。

数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。

数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

数据库事务并发可能带来的问题:

第一类丢失更新(lost update):两个事物更新同一条数据资源,某一事物异常终止,回滚造成第一个完成的更新也同时丢失。

脏读(dirty read):如果第二个事务查询到第一个事务还未提交的更新数据,形成脏读。

虚读(phantom read):一个事务执行两次查询,造成两次结果不一致。

不可重复读(unrepeated read):一个事务两次读取同一行数据,结果得到不同状态结果。

第二类丢失更新(second lost updates):是不可重复读的特殊情况,如果两个事务都读取同一行,然后两个都进行写操作,并提交,第一个事务所做的改变就会丢失。

数据库系统提供四种事务隔离级别:

Serializable 串行化 :第一个完成,第二个才开始

Repeatable Read 可重复读 :同时读

Read Commited 可读已提交 :第一个只有在提交过后,第二个才可以操纵

Read Uncommited 可读未提交 :第二个可以操纵第一个还没提交的数据

在Hibernate的配置文件中可以显示的配置数据库事务隔离级别。每一个隔离级别用一个整数表示:

8 - Serializable 串行化

4 - Repeatable Read 可重复读

2 - Read Commited 可读已提交

1 - Read Uncommited 可读未提交

在hibernate.cfg.xml中使用hibernate.connection.isolation参数配置数据库事务隔离级别。

<session-factory>

…..

//把隔离级别设置为4

<property name="hibernate.connection.isolation">4</property>

……

</session-factory>

设置之后,在开始一个事务之前,Hibernate将为从连接池中获得的JDBC连接设置级别。需要注意的是,在受管理环境中,如果Hibernate使用的数据库连接来自于应用服务器提供的数据源,Hibernate不会改变这些连接的事务隔离级别。在这种情况下,应该通过修改应用服务器的数据源配置来修改隔离级别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息