Spring事务隔离级别及设置

本文深入探讨Spring中事务隔离级别的概念,包括DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE等,解释了它们的含义及应用场景,并详细阐述了脏读、不可重复读和幻像读的原理。
摘要由CSDN通过智能技术生成

在Spring中定义了5中不同的事务隔离级别: 【 DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE 】4 p" L. I' F; k1 {) a. D( E5 ?: V、READ_COMMITTED 

1. ISOLATION_DEFAULT(一般情况下使用这种配置既可) ;

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。


2. ISOLATION_READ_UNCOMMITTED 4 p" L. I' F; k1 {) a. D( E5 ?: V
这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

大部分数据库缺省的事物隔离级别都不会出现这种状况) 1 N$ G7 X" U# U6 S/ u' z/ I


什么是脏读?(修改且未提交引起
例如:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。' T, B  j  d! H# i) s$ i

(大部分数据库缺省的事物隔离级别都不会出现这种状况) ; N$ ~" J7 a& Y* ?/ G8 I



3. ISOLATION_READ_COMMITTED  

保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。: U8 m# n8 g1 k( E: N


什么是不可重复读?( 修改引起 6 h2 E% J, S7 f9 n+ m0 U4 ]" ?% e. a
例如: / ^7 Y# T6 |& Z' B
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。 5 K: N6 c" [$ p: J4 L/ I" B
与此同时,事务B把张三的工资改为8000,并提交了事务。随后,在事务A中,再次读取张三的工资,此时工资变为8000。 在一个事务中前后两次读取的结果并不致,导致了不可重复读

(大部分数据库缺省的事物隔离级别都不会出现这种状况) . h+ U! y9 {) }1 R8 ~% B, l; t



4. ISOLATION_REPEATABLE_READ  

这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。 3 [* {- F2 s. w+ |




5. ISOLATION_SERIALIZABLE
这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。 % c0 @8 E& g" x1 X/ p3 F; H1 q
什么是幻读?( 添加新记录引起 9 d! D% j. |9 w9 N+ ~
例如:
A目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。

大部分数据库缺省的事物隔离级别都会出现这种状况,此种事物隔离级别将带来表级锁)


在使用基于tx/aop配置的声明式事务时,可在事务增强中:

<tx:advice id="txAdvice" transaction-manager="txManager">

   <tx:attributes>

         <tx:method isolation="DEFAULT" />  

   </tx:attributes>

<tx:advice>



在Hibernate的配置文件hibernate.properties中,可以修改隔离级别:

#hibernate.connection.isolation 4

在上一行代码中,Hibernate事务的隔离级别是4
,这是什么意思呢?级别的数字意义如下。

1:读操作未提交(Read Uncommitted)
2:读操作已提交(Read Committed)
4:可重读(Repeatable Read)
8:可串行化(Serializable)

因此,数字4表示“可重读”隔离级别。如果要使以上语句有效,应把此语句行前的注释符“#”去掉:

hibernate.connection.isolation 4

也可以在配置文件hibernate.cfg.xml
中加入以下代码:

 
<session-factory>
…..
//
把隔离级别设置为4
<property name=”hibernate.connection.isolation”>4</property>
……
</session-factory>

在开始一个事务之前,Hibernate从配置文件中获得隔离级别的值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值