`
spring5365
  • 浏览: 71697 次
  • 性别: Icon_minigender_1
  • 来自: 钓鱼岛
社区版块
存档分类
最新评论

spring事务的传播行为与隔离级别

阅读更多
spring事务的传播行为是面试中经常被问到的问题,要将事务的传播行为与隔离级别熟练的掌握,在实际开发过程中,特别是在并发高、更新数据量大、关系表比较多的情况下,经常会遇到关于事务的问题。
首先,要了解的是什么是数据库的隔离级别。在一个典型的应用中,并发是不可避免的,多个事务并发运行,操作同一个数据来完成任务。并发可能会导致以下问题:
脏读(Dirty read):脏读发生在一个事务读取了被另一个事务改写但还未提交的数据时。如果这些改变在稍后被回滚,那么之前的事务读取的到数据就是无效的。
不可重复读(Nonrepeatable read):不可重复读发生在一个事务执行相同的查询两次或两次以上,但每一次的查询结果不同时。这通常是由于另一个并发的事务在两次查询之间更新了数据。
幻读(Phantom read):幻读是一个事务读取几行记录后,另一个事务插入了一些记录,幻读就发生了。在后来的查询中第一个事务就会发现有一些原来没有的额外的记录。
不可重复读和幻读的差异似乎是一个是更新操作一个是插入操作,这一点也请知道的人指正。

spring的事务隔离级别
ISOLATION_DEFAULT:使用数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
ISOLATION_READ COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读。
ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。
可以根据自己的系统对数据的要求采取适应的隔离级别,因为隔离牵涉到锁定数据库中的记录,对数据正性要求越严格,并发的性能也越差。

spring的事务传播行为
spring事务的传播行为说的是当一个方法调用另一个方法时,事务该如何操作。
PROPAGATION_MANDATORY:该方法必须运行在一个事务中。如果当前事务不存在则抛出异常。
PROPAGATION_NESTED:如果当前存在一个事务,则该方法运行在一个嵌套的事务中。被嵌套的事务可以从当前事务中单独的提交和回滚。如果当前不存在事务,则开始一个新的事务。各厂商对这种传播行为的支持参差不齐,使用时需注意。
PROPAGATION_NEVER:当前方法不应该运行在一个事务中。如果当前存在一个事务,则抛出异常。
PROPAGATION_NOT_SUPPORTED:当前方法不应该运行在一个事务中。如果一个事务正在运行,它将在该方法的运行期间挂起。
PROPAGATION_REQUIRED:该方法必须运行在一个事务中。如果一个事务正在运行,该方法将运行在这个事务中。否则,就开始一个新的事务。
PROPAGATION_REQUIRES_NEW:该方法必须运行在自己的事务中。它将启动一个新的事务。如果一个现有的事务正在运行,将在这个方法的运行期间挂起。
PROPAGATION_SUPPORTS:当前方法不需要事务处理环境,但如果一个事务已经在运行的话,这个方法也可以在这个事务里运行。

在现实的应用中,由于业务上的需要,要求不同表中的数据保持一致,即要求不同表中的数据同时更新或者出错时同时回滚,事务的本质其实就是为了解决这样的问题。

分享到:
评论
6 楼 cesymm 2011-03-17  
不可重复读和幻读其实都是一种情况.
这类情况可以分为三类:
1.其它事务插入新事务对本事务的影响
2.其它事务删除................
3.其它事务修改同一条记录对本事务的影响
第3种就是 第二类丢失更新
不知道我说的对不????????
5 楼 毕竟红尘 2011-01-11  
这个哥们结合了一些例子来阐述LZ说的这个主题,还比较清晰,可以结合起来看一下。
http://vae.iteye.com/blog/476457
4 楼 spring5365 2011-01-10  
非常感谢楼上的解答
3 楼 CoderPlusPlus 2011-01-10  
不可重复读和幻读的区别在于解决手段,以下是一个不严谨的解释
对于select * from t where id='xxx',如果其它事务更改了id为xxx的记录,就会导致这一条语句两次读取的内容不一致,要防止不可重复读,只需锁定id为xxx的行就可以

而select * from t where age > 50,如果其它事务更改了别的数据,使原本age不大于50的变成了age>50(同理还有insert一条age>50的记录),那就会使得第二次读取时的结果集里记录多出一部分(或者消失了一部分),就好像产生幻觉了,要防止幻读就不是锁定age>50的行能够解决的,而需要锁定查询涉及到的全集

所以这两个概念不是凭空制订的,他们代表着两个不同的锁定范围,代表这不同的两个数据一致性和性能的平衡,这也正是隔离级别的核心意义
2 楼 spring5365 2011-01-10  
choha 写道
幻读是在不可重读的基础上出来的,如果说他们的区别就是一个是更新操作一个是插入操作的话,幻读和不可重读就属于一类问题了,解决一个,也就解决了两个。他俩的主要区别应该是不可重读强调的是在同一个事务中执行两个select语句,是得到的内容不同。但是幻读强调的重点不是两次select。举个列子:事务1包含了一条select语句和insert语句,而事务2是在事务1的select语句和insert语句之间的时间段内,插入了一条和事务1的insert语句一样的内容,这个时候就会报错(可能报XXX不能重复之类的吧)。这个应该是幻读真真的描述的问题所在。不知道我的理解对不?还请lz给予说明,哈哈

这个问题也是我一直没有找到答案的,所以上面加了一句“不可重复读和幻读的差异似乎是一个是更新操作一个是插入操作,这一点也请知道的人指正。 ”,欢迎论坛里对这个问题能够清晰阐述的朋友给个正确的答案,或者大家一起探讨
1 楼 choha 2011-01-10  
幻读是在不可重读的基础上出来的,如果说他们的区别就是一个是更新操作一个是插入操作的话,幻读和不可重读就属于一类问题了,解决一个,也就解决了两个。他俩的主要区别应该是不可重读强调的是在同一个事务中执行两个select语句,是得到的内容不同。但是幻读强调的重点不是两次select。举个列子:事务1包含了一条select语句和insert语句,而事务2是在事务1的select语句和insert语句之间的时间段内,插入了一条和事务1的insert语句一样的内容,这个时候就会报错(可能报XXX不能重复之类的吧)。这个应该是幻读真真的描述的问题所在。不知道我的理解对不?还请lz给予说明,哈哈

相关推荐

    spring 事务传播与隔离级别DEMO

    本DEMO主要探讨的是Spring事务的传播行为和隔离级别,这些概念对于理解和优化数据库操作至关重要。让我们深入理解这些概念及其实际应用。 首先,我们来谈谈事务的传播行为。在Spring中,当一个方法被另一个具有事务...

    spring事务的传播特性和事务隔离级别

    ### Spring事务的传播特性和事务隔离级别 #### 一、Spring事务的传播特性(Propagation) 在Spring框架中,事务管理不仅提供了ACID属性的支持,还引入了事务的传播特性,这些特性决定了当一个方法调用另一个方法时,...

    SPRING事务传播特性&事务隔离级别

    ### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

    Spring事务的传播特性和隔离级别

    ### Spring事务的传播特性和隔离级别 #### 一、事务的基本概念 在计算机科学中,事务(transaction)是指一系列操作的集合,这些操作要么全部成功完成,要么全部失败回滚,确保数据的一致性和完整性。事务具备四个...

    Spring控制Hibernate中的事务传播特性与隔离级别操作.docx

    4. **声明式事务管理**:Spring允许在配置文件中声明事务边界,这样可以在多个方法之间定义事务传播行为和隔离级别,而无需在代码中显式处理。 例如,以下是如何使用HibernateTemplate删除Userinfo对象: ```java ...

    事务传播特性&事务隔离级别

    事务传播特性&事务隔离级别 事务传播特性是指在 Java 中,事务的传播行为,即在多个事务之间如何交互和传播。Java 中有七种事务传播特性,分别是: 1. PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。...

    spring 事务传播 demo

    本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...

    事务的传播行为和隔离级别.docx

    事务传播行为定义了当方法被另一个带有事务属性的方法调用时,该方法如何处理事务。Spring 提供了多种不同的传播行为选项,这些选项可以帮助开发者更好地控制事务的创建与参与。 #### 1. `@Transactional...

    Spring 管理事务(传播特性、隔离级别、readonly).rar

    本知识点将深入探讨Spring中的事务管理,主要包括事务的传播特性、隔离级别以及readonly属性。 1. 事务的传播特性: 在Spring中,事务的传播特性定义了在一个事务方法被另一个事务方法调用时,应该如何处理事务...

    JDBC事务 JTA事务 传播特性 隔离级别

    最后,我们提到的是**事务的传播特性**,这是Spring框架中的一种概念,它定义了在一个事务上下文中如何执行另一个方法。例如: - **Not Supported**:不支持事务,如果当前有事务,会挂起事务。 - **Supports**:...

    spring 事务传播

    通过上述对Spring事务传播行为的详细介绍,我们可以看出,正确理解和应用这些传播行为对于构建健壮的事务管理机制至关重要。每种传播行为都有其特定的应用场景和限制条件,开发者应根据具体的业务逻辑和需求来合理...

    Spring事务传播属性和隔离级别详细介绍

    Spring事务传播属性和隔離级别详细介绍 Spring事务传播属性(Propagation)是指在事务中如何...Spring事务传播属性和隔离级别是对事务进行管理和控制的重要机制,可以帮助开发者更好地管理事务,避免各种并发问题。

    Java面试题54.Spring事务的传播特性和隔离级别.mp4

    Java面试题54.Spring事务的传播特性和隔离级别.mp4

    02.Spring支持的常用数据库事务传播属性和事务隔离级别.zip

    本资料主要探讨的是Spring支持的数据库事务传播属性和事务隔离级别。 一、事务传播属性 1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。这是最常见的事务定义,适用于...

    spring事物的7大传播机制,5个隔离机制

    ### Spring事务的七大传播行为 ...总结来说,选择合适的事务传播行为和隔离级别对于确保应用程序的数据一致性至关重要。开发者需要根据业务需求权衡性能和数据一致性之间的关系,以选择最合适的设置。

    Spring事务流程图

    5. **事务传播行为**:Spring提供了七种事务传播行为,如REQUIRED(默认)、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED,它们决定了事务如何在方法调用之间传播。 时序图是一种UML建模工具...

    Spring事务传播机制.docx

    事务的隔离级别和传播行为是理解Spring事务管理的关键概念。以下是对这两个主题的详细解释: 首先,我们来看看Spring支持的五个事务隔离级别: 1. **DEFAULT**:这是PlatformTransactionManager的默认隔离级别,它...

    spring事物隔离和传播机制

    ### Spring 事务隔离和传播机制详解 #### 一、Spring 事务传播机制 Spring 的事务管理功能非常强大,其中一个重要特性...在实际开发中,选择合适的事务传播行为和隔离级别对于保证数据一致性、避免并发问题至关重要。

Global site tag (gtag.js) - Google Analytics