`
king_tt
  • 浏览: 2124094 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate的事务处理方式和并发控制

阅读更多

事务的概念

事务是访问数据库时,可能更新数据库中各种数据项的一个程序执行单元,用来确保数据的完整性,避免数据库中的数据在不正确的操作下引起的错误更改。

事务的4个特性

1.原子性。指事务执行单元是一个不可分割的单元,这些单元要么都执行,要么都不执行。

2.一致性。指无论执行了什么操作,都应该保证数据的完整性和业务逻辑的一致性。

3.隔离性。在事务执行过程中,多个执行单元间操作的数据都是其它单元没有操作或者操作结束后的数据,保证每一个执行单元操作的数据都有完整的数据空间。

4.持久性。事务结束后,执行单元操作的数据被保存在数据库中,这些数据的保存状态是永久性的,不会因为系统故障而消失。

Hibernate框架中支持两种事务处理方式

(1)JDBC事务处理(2)JTA(JavaTransactionAPI)事务处理

这两种事务处理方式默认情况下都是关闭的,可以通过配置开启事务管理,如果不进行配置,会默认使用JDBC事务。

(1)编程过程中应用JDBC事务管理的流程

1.实例化Configure类读取配置文件或者属性文件

2.获取sessionFactory实例

3.通过sessionFactory获得session实例

4.通过session.beginTransaction()获得事务Transaction对象

5.开始事务,进行数据操作

6.提交事务,数据处理结束后提交事务

7.回滚事务,如果数据处理出现异常则回滚事务,恢复原始数据

8.提交事务,关闭session

(2)编程过程中应用JTA事务管理的流程

概念--JTAJ2EE事务服务的标准解决方式,通过容器来控制事务。主要应用在多数据库操作的分布式系统中。JTA事务处理首先创建事务处理对象,然后实例化Session,它的事务生命周期要比session的生命周期长。另外,JTA事务处理和JDBC事务处理不能同时使用。流程如下:

1.创建JTA事务对象

2.开始事务

3.获得session并编写操作数据的方法

4.关闭session

5.提交事务

6.如果遇到到异常事件则回滚事务

 

事务的并发控制?

首先,什么是并发?在Hibernate应用中,并发主要是指同一个时间段内多个事务共同请求同一个资源。对于并发如果不进行相应的控制,将产生一系列的问题。

其次,并发会产生哪些问题?

(1)第一类丢失更新:当两个或多个事务同时更新同一资源时,第一个事务已经更新了数据,而第二个事务由于被中断而撤消了事务,导致第一个事务也被撤消,那么数据将恢复到原始的状态。

(2)脏读:当两个或多个事务同时操作一个资源时,第一个事务更新了数据但未提交,此时第二个事务读取了该条数据并进行了处理,此时由于第一个事务被某种原因撤消了,那么第二个事务处理的数据就称之为脏数据。

(3)虚读:虚读是由于当前的一个事务查询到了另一个事务新插入的数据而引起的,当第一个事务查询了数据库的记录数时,第二个事务向数据库中增加了一条数据,改变了当前的记录数目,那么第一个事务获得的数据就是虚读的数据,该数据与数据库中的实际数据不相同。

(4)不可重复读:当第一个事务修改数据时,第二个事务在它的提交事务的前后,两次读取了第一个事务所修改的数据,导致第二个事务两次读的数据不匹配。

(5)第二类丢失更新:它是不可重复读的一个特例,当多个事务同时读取到了一条资源记录,分别根据自身的逻辑进行处理,最后分别提交事务。问题发生在最后提交的事务会覆盖前面所有提交的事务的数据,导致数据最终的完整性被破坏。

 

并发控制的解决方案?

为了解决在事务并发过程中出现的问题,Hibernate提供了一种特殊的处理方式----锁。锁有两种形式:悲观锁和乐观锁。

悲观锁:认为所有的事务都在请求当前事务正在处理的资源,因此将正在处理的数据资源上锁,其它所有事务都不可以访问上锁的资源。只有当前的事务提交后,其它事务才可以访问刚刚被提交的数据。Query类和Criteria类的 setLockMode()方法及Session类的load()lock()方法都可以进行加锁。锁定模式如下:

乐观锁:认为访问数据库的事务很少发生数据访问错误等问题。当数据出现了不一致的状态时,Hibernate采用版本检查和时间戳等技术来实现读取数据。

——(1)版本控制:版本控制技术是在操作的数据表中增加一个版本号字段,习惯上将该版本号命名为version,当一个新事务到来时,首先加载版本号,如果版本号和数据库中的版本号相等,那么允许事务进行数据操作,否则给出警告信息,数据操作人员可以选择继续还是放弃当前的操作。注意:使用版本控制技术是通过程序实现在锁定机制,如果一个事务更改了版本信息,那么另一个事务必须先获得新的版本号以后才可以进行数据操作。

——(2)时间戳:使用时间戳就是在数据表中增加一个时间类型的版本号,操作数据的事务必须匹配当前的时间才可以进行数据操作。

 

锁的使用原则:

对于数据访问频率较低并且一旦产生冲突后果极其严重的的情况应该使用悲观锁;对于要求性能和效率的数据访问频率高,即使发生数据冲突后果也不是很严重的情况可以使用乐观锁。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics