`

Spring中的事务传播属性详解

    博客分类:
  • java
阅读更多

文章不错,转载于:http://developer.51cto.com/art/200812/102708.htm

 

 

在使用Spring时,大部分会用到他的声明式事务,简单的在配置文件中进行一些规则配置,利用Spring的AOP功能就能轻松搞定事务问题;这 里面就涉及到一个事务的传播属性问题Propagation,它在TransactionDefinition接口中定义,以供 PlatfromTransactionManager使用,PlatfromTransactionManager是spring事务管理的核心接口

TransactionDefinition 
public interface TransactionDefinition { 
 int getPropagationBehavior(); 
 int getIsolationLevel(); 
 int getTimeout(); 
 boolean isReadOnly(); 
} 

 

 

getTimeout()方法,它返回事务必须在多少秒内完成。

 

isReadOnly(),事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的。

 

getIsolationLevel()方法返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。

 

在TransactionDefinition接口中定义了五个不同的事务隔离级别,ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对 应,ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

 

在TransactionDefinition接口中共有7种选项可用:

 

PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

 

PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

 

PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。

 

PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。

 

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

 

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

 

PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。

 

现在结合一个实例,应用以上各种传播属性来进行说明:首先声明两个bean:ServiceA和ServiceB,其中ServiceB被引

 ServiceA { 
         void methodA() { 
             ServiceB.methodB(); 
         } 
    } 
    ServiceB {
         void methodB() { 
         } 
    } 

 

 

 

接下来,我们就一一分析下:

 

PROPAGATION_REQUIRED

 

加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务;比如说,ServiceB.methodB的事务级别定义为 PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候, ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在 ServiceA.methodA 的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。 这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使 ServiceB.methodB的事务已经被 提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚。

 

PROPAGATION_SUPPORTS

 

如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行。

 

PROPAGATION_MANDATORY

 

必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。

 

PROPAGATION_REQUIRES_NEW

 

比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级 别为PROPAGATION_REQUIRES_NEW, 那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个 新的事务,等待ServiceB.methodB的事务完成以后, 他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在 两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不 会回滚的。如果ServiceB.methodB失败回滚, 如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

 

PROPAGATION_NOT_SUPPORTED

 

当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED, 那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续 ServiceA.methodA的事务。 网管联盟bitsCN_com

 

PROPAGATION_NEVER

 

不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER, 那么ServiceB.methodB就要抛出异常了。

 

PROPAGATION_NESTED

 

理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别 是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立, 而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。 而Nested事务的好处也是他有一个savepoint

ServiceA { 
        void methodA() {             
       try { 
                ServiceB.methodB(); 
            } catch (Exception e) {  
                ServiceC.methodC(); 
            }  
        }  
    } 

 

 

 

也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA会回滚到savepoint点 上,ServiceA.methodA可以选择另外一个分支,比如 ServiceC.methodC,继续执行,来尝试完成自己的事务;但是这个事务并没有在EJB标准中定义。

分享到:
评论

相关推荐

    Spring中事务的传播属性详解

    本文将详细介绍Spring中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### 二、事务传播属性概述 事务传播行为(Propagation)定义了当一个事务方法被另一个事务方法调用时的行为。在Spring中,...

    spring几种事务配置详解【精】

    Spring支持七种事务传播行为: - `REQUIRED`:如果当前没有事务,就新建一个;如果已经存在一个事务,则加入到这个事务中。 - `SUPPORTS`:如果当前存在事务,就加入;如果没有事务,则不开启。 - `MANDATORY`:...

    spring 事务传播

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

    Spring在Transaction事务传播行为种类

    ### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...

    Spring事务详解

    在Spring中,我们可以选择不同的事务传播行为,例如PROPAGATION_REQUIRED(默认)表示如果当前存在事务,则加入该事务,如果不存在则新建一个;PROPAGATION_REQUIRES_NEW表示始终新建一个事务,与当前事务无关等。...

    spring事务详解

    Spring事务详解 Spring框架的事务管理功能是Java企业级开发中的重要组成部分,它将事务管理从具体的业务逻辑和数据访问逻辑中独立出来,实现了关注点分离。这种分离不仅降低了事务管理的复杂性,而且增强了代码的可...

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

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

    spring事务几种传播方式

    ### Spring事务传播方式详解 #### 一、引言 在基于Spring框架开发的应用程序中,事务管理是一项重要的功能。为了确保数据的一致性和完整性,合理地配置事务的传播行为至关重要。Spring提供了多种事务传播行为选项...

    Hibernate缓存与spring事务详解

    **标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...

    Spring事务优缺点及使用详解.docx

    2. 注解事务:通过在业务方法上添加@Transactional注解,指定事务的隔离级别、传播行为等属性。 3. 由Spring管理事务生命周期:Spring会在方法执行前后自动开始和结束事务,如果发生异常,Spring会自动回滚事务,...

    Spring 事务隔离与事务传播的详解与对比

    Spring 事务隔离与事务传播的详解与对比 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中...

    实例详解Spring JDBC事务管理.doc

    Spring事务管理机制 Spring的事务管理机制是基于PlatformTransactionManager接口的实现的,该接口定义了三个方法:getTransaction、commit和rollback。这三个方法是事务管理的核心,分别负责事务的开启、提交和...

    主题:详解spring事务属性.doc

    Spring 声明式事务是Java开发中一种高效且便捷的事务管理方式,它通过AOP(面向切面编程)实现,将事务管理代码从业务逻辑中解耦出来。Spring 提供了`PlatformTransactionManager`接口作为事务管理的核心,它负责...

    Spring 事务详解面试

    注解用于声明事务的属性,比如事务的传播行为、隔离级别、回滚规则等。通过注解,开发者可以将事务管理逻辑从业务逻辑中分离出来。 编程式事务则需要开发者在代码中手动控制事务的开始、提交和回滚。虽然这种方法...

    Spring框架+Spring中的事务

    #### 三、Spring事务传播机制详解 **1. 事务传播机制的概念** 事务传播机制是指在多个事务操作发生时,如何管理这些操作之间的事务关系。在Spring框架中,可以通过`org.springframework.transaction.annotation....

    Spring声明式事务配置管理方法

    Spring提供了七种事务传播行为: - `PROPAGATION_REQUIRED`:如果存在事务,则加入;否则新建。 - `PROPAGATION_REQUIRES_NEW`:始终新建事务,如果已有事务则挂起。 - `PROPAGATION_SUPPORTS`:如果存在事务,...

Global site tag (gtag.js) - Google Analytics