Hibernate事务管理

Posted 星空异皓`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate事务管理相关的知识,希望对你有一定的参考价值。

1.1 Hibernate事务管理

1.1事务介绍

问题:什么是事务?

事务就是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全都失败。

问题:事务四个特性?

原子性:强调事务是不可分割最小单元

一致性:事务在执行前后,要保证数据的一致。

隔离性:一个事务在执行的过程中,不应该受到其它事务的干扰。

持久性:事务一旦结束,数据持久化到数据库。

问题:不考虑事务的隔离性,会产生什么问题?

写问题:丢失更新

1)产生丢失更新的原因

丢失更新就是两个不同的事务(或者开启两个线程)在某一时刻对同一数据进行读取后,先后进行修改。导致第一次操作数据丢失。

2)解决方式

使用数据库锁机制防止数据丢失

(1)共享说

共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁

(2)排它锁

排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。

 

读问题:脏读、不可重复读、虚度

脏读:一个事务读取到另一个事务的未提交数据

【注释说明】例如在执行update操作时,这个事务未提交,数据库的数据就没有发生该表;此时再执行select操作时,第二个事务就能读取到更新数据之后的数据信息;问题是数据库的数据没有发生改变,但select查询的数据是与数据库中的数据不一致了。

不可重复读:一个事务读取到另一个事务提交的数据(主要是指update),会导致两次读取的结果不一致。

【注释说明】在执行update操作时,

 

虚读(幻读): 一个事务读取到另一个事务提交的数据(主要是指insert),会导致两次读取结果不一致.

问题:对于上述问题如何解决?

处理事务:效率越来越低,但安全性越来越高

我们可以通过设置隔离级别来解决读的问题.

READ_UNCOMMITED 读取未提交:它引发所有的隔离问题

READ_COMMITTED   读已提交,阻止脏读可能发生不可重复读与虚读.

REPEATABLE_READ    重复读  阻止脏读,不可重复读:可能发生虚读

    SERIALIZABLE        串行化 解决所有问题 不允许两个事务,同时操作一个目标数据。(效率低下,但操作安全是最安全的)

 

ORACLE  默认的是事务隔离级别  READ_COMMITTED

mysql  默认的事务隔离级别    REPEATABLE_READ

 

1.2Hibernate中设置事务隔离级别

hibernate.connection.isolation 

它可取的值有 1 2 4 8

1代表的事务隔离级别为READ UNCOMMITTED

2代表的事务隔离级别为READ COMMITTED

4.代表的事务隔离级别为 REPEATABLE READ

8代表的事务隔离级别为 SERIALIZABLE

 

hibernate.cfg.xml文件中配置

<!-- 设置事务隔离级别-->

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

说明:hibernate.connection.isolation 

它可取的值有 1 2 4 8

1代表的事务隔离级别为READ UNCOMMITTED

2代表的事务隔离级别为READ COMMITTED

4.代表的事务隔离级别为 REPEATABLE READ

8代表的事务隔离级别为 SERIALIZABLE

 

以上是关于Hibernate事务管理的主要内容,如果未能解决你的问题,请参考以下文章

Spring对Hibernate事务管理

Spring与Hibernate整合,实现Hibernate事务管理

spring与hibernate整合事务管理的理解

Spring对hibernate的事物管理

Hibernate事务管理

Hibernate中事务声明