`
MauerSu
  • 浏览: 509409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring Transaction属性之Propagation

 
阅读更多
源:http://blog.csdn.net/kiwi_coder/article/details/20214939
评:
Spring Transaction中有一个很重要的属性:Propagation。主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系。

我晓得有点儿抽象,这也是为什么我想要写这篇博客的原因。看了后面的例子,大家应该就明白了。


一、Propagation取值:

REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;

SUPPORTS:如当前有transaction,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行;

MANDATORY:必须在有transaction状态下执行,如果当前没有transaction,则抛出异常IllegalTransactionStateException;

REQUIRES_NEW:创建新的transaction并执行;如果当前已有transaction,则将当前transaction挂起;

NOT_SUPPORTED:在无transaction状态下执行;如果当前已有transaction,则将当前transaction挂起;

NEVER:在无transaction状态下执行;如果当前已有transaction,则抛出异常IllegalTransactionStateException。


二、REQUIRED与REQUIRED_NEW

上面描述的6种propagation属性配置中,最难以理解,并且容易在transaction设计时出现问题的是REQUIRED和REQURED_NEW这两者的区别。当程序在某些情况下抛出异常时,如果对于这两者不够了解,就可能很难发现而且解决问题。


下面我们给出三个场景进行分析:

场景一:

ServiceA.java:

public class ServiceA {
    @Transactional
    public void callB() {
        serviceB.doSomething();
    }
}

ServiceB.java

public class ServiceB {
    @Transactional
    public void doSomething() {
        throw new RuntimeException("B throw exception");
    }
}
这种情况下,我们只需要在调用ServiceA.callB时捕获ServiceB中抛出的运行时异常,则transaction就会正常的rollback。


场景二

在保持场景一中ServiceB不变,在ServiceA中调用ServiceB的doSomething时去捕获这个异常,如下:

public class ServiceA {
    @Transactional
    public void callB() {
        try {
            serviceB.doSomething();
        } catch (RuntimeException e) {
            System.err.println(e.getMessage());
        }
    }
}
这个时候,我们再调用ServiceA的callB。程序会抛出org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only这样一个异常信息。原因是什么呢?

因为在ServiceA和ServiceB中的@Transactional propagation都采用的默认值:REQUREID。根据我们前面讲过的REQUIRED特性,当ServiceA调用ServiceB的时候,他们是处于同一个transaction中。如下图所示:


当ServiceB中抛出了一个异常以后,ServiceB会把当前的transaction标记为需要rollback。但是ServiceA中捕获了这个异常,并进行了处理,认为当前transaction应该正常commit。此时就出现了前后不一致,也就是因为这样,抛出了前面的UnexpectedRollbackException。


场景三

在保持场景二中ServiceA不变,修改ServiceB中方法的propagation配置为REQUIRES_NEW,如下:

public class ServiceB {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void doSomething() {
        throw new RuntimeException("B throw exception");
    }
}
此时,程序可以正常的退出了,也没有抛出UnexpectedRollbackException。原因是因为当ServiceA调用ServiceB时,serviceB的doSomething是在一个新的transaction中执行的。如下图所示:


所以,当doSomething抛出异常以后,仅仅是把新创建的transaction rollback了,而不会影响到ServiceA的transaction。ServiceA就可以正常的进行commit。

当然这里把ServiceA和ServiceB放在两个独立的transaction是否成立,还需要再多多考虑你的业务需求。


Transaction不是一个新东西了,那对于transaction的使用会不会有一些模式?一些经验之谈呢?答案肯定是有的,以后博客再说。


参考资料:Spring Transaction Propagation
分享到:
评论

相关推荐

    Spring 常用 Transaction Annotation

    本篇主要聚焦于"Spring 常用 Transaction Annotation",即声明式事务管理,这是一种更简洁、易于维护的事务控制方式。 首先,Spring的声明式事务管理基于AOP(面向切面编程),它允许我们在不修改业务代码的情况下...

    Spring在Transaction事务传播行为种类

    在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为(Propagation Behavior)。本文将详细介绍Spring框架中定义的七种不同的...

    springtransaction 事务管理

    在实际项目中,`springtransaction`工程可能是包含了一个完整的示例,用于演示如何在MyEclipse环境中配置和使用Spring的事务管理功能。开发者可以通过导入此工程,学习和实践Spring事务管理的配置与使用,从而更好地...

    Spring事务管理的jar包

    除了基本的事务控制,Spring还提供了丰富的事务属性,如传播行为(PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS等)、隔离级别(ISOLATION_DEFAULT、ISOLATION_READ_UNCOMMITTED等)和事务超时设置,允许开发者根据...

    spring-transaction-demo:spring-transaction-demo

    本项目"spring-transaction-demo"是一个用于演示Spring框架事务管理特性的实例。下面我们将详细探讨Spring事务的传播机制以及其在实际应用中的七种使用方式。 1. **Spring事务的概述** Spring事务管理是通过编程或...

    spring事物管理

    Spring 事务管理是Java开发中一个至关重要的概念,特别是在企业级应用中,它确保了数据的一致性和完整性。Spring 提供了一种灵活的方式来管理和控制事务的边界,这主要体现在TransactionDefinition接口定义的7种事务...

    Implementing Transaction Suspension in Spring

    在Spring框架中,事务管理是其核心特性之一,它提供了灵活且强大的数据访问和事务处理能力。本篇文章将深入探讨Spring的事务管理机制,特别是如何实现事务的挂起(Transaction Suspension),并展示如何利用Spring的...

    Spring2.5_JPA_Transaction_Demo

    6. **异常处理与事务回滚**:如果在事务中抛出未检查异常(继承自RuntimeException的异常)或者TransactionDefinition.PROPAGATION_REQUIRED或TransactionDefinition.PROPAGATION...

    spring框架配置bean的高级属性

    <bean id="transactionProxyFactory" abstract="true" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> *">PROPAGATION_REQUIRED *">PROPAGATION_...

    Spring事务管理和SpringJDBC思维导图

    在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...

    spring 事务传播

    ### Spring 事务传播属性详解 #### 一、Spring 事务基础概述 在深入探讨Spring框架中的事务传播属性之前,我们先来简要回顾一下Spring事务的基础概念。Spring框架提供了强大的事务管理功能,允许开发者通过声明式...

    springboot-transaction-demo:对于Spring事务的简单测试

    `springboot-transaction-demo`项目是一个典型的示例,用于展示如何在Spring Boot中配置和使用事务管理。本项目着重于Spring的事务处理机制,这包括事务的声明式管理、编程式管理以及相关的异常处理策略。 1. **...

    实验 spring 声明事务

    声明式事务管理的原理在于,当满足特定条件(如上述配置中的方法匹配)时,Spring 会自动开始、提交或回滚事务,无需在业务逻辑代码中显式调用`beginTransaction()`、`commit()`或`rollback()`等事务管理API。...

    Spring事务原理、Spring事务配置的五种方式

    <bean id="userManager"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> ...

    spring事务与数据库操作

    <tx:advice id="txAdvice" transaction-manager="transactionManager"> *" propagation="REQUIRED" rollback-for="Exception"/> *" propagation="REQUIRED" rollback-for="Exception"/> *" propagation=...

    spring_tx的案例源码

    在Spring框架中,事务管理(Transaction Management)是一个关键特性,它确保了数据的一致性和完整性。本篇将深入探讨"spring_tx"案例源码中的事务管理相关知识点。 1. **Spring事务管理模型** Spring提供了两种...

    Spring 事务代理配置

    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED *">...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    4. **事务传播行为**: 在多层服务调用中,可以通过设置`@Transactional`的propagation属性,如`REQUIRED`(默认,如果有事务就加入,没有就新建)、`REQUIRES_NEW`(总是新建事务)等,来处理事务的传播。...

    spring的5中事物配置 介绍spring的5中事物配置

    <bean id="userDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置事务管理器 --> <!-- 配置需要代理的方法 --> <!-- 配置事务属性 --> *">...

    spring学习事务源码

    在Spring框架中,事务管理是核心特性之一,它使得开发者能够在多操作数据库时保持数据的一致性和完整性。本文将深入探讨Spring事务管理的源码,理解其背后的实现机制。 首先,Spring事务管理有两种主要模式:编程式...

Global site tag (gtag.js) - Google Analytics