`

spring声明式事务详解

阅读更多

 

class A {
    public void addA() {
        // something...
    }
    public void addB() {
        // something...
    }
    public void addAll() {
        addA();
        addB();
    }
}

addB和addAll的传播行为REQUIRE

 

如果addA的传播行为REQUIRES_NEW

当调用addAll的时候并不会给addA()重新开启一个事务,而是在addAll事务之中。(就像addAll方法调用非事务的普通方法会被包含在addAll事务中)

 

因为spring的AOP(动态代理)的原因

在一次方法调用过程中一个类中的方法只会被代理一次,不会被多次代理,而且代理的是调用的那个方法

所以如果调用的是addAll 则只会为addAll代理,并且根据其传播行为开启事务,addA和addB 由于和AddAll是在同一个类中

所以不会再开启事务。只有方法中调用的是其他类的方法时才生效。

 

总结:声明式事务传播属性只发生在不同的类之间。

 

第一个场景:

同一个BO类的一个方法中,如果catch住异常,那么事务管理就会认为没有异常,而提交事务。



 

第二个场景

同一个BO类的一个方法中,如果往外抛异常了,事务管理就会认为方法异常,从而回滚事务。



 

第三个场景

同一个BO类的两个方法中,A方法中进行create操作,之后A方法中调用B方法进行delete操作,A,B方法都受事务控制。当B方法发生异常,且在B方法中catch住异常,那么事务就会认为没有异常,而提交事务。



 

第四个场景

同一个BO类的两个方法中,A方法中进行create操作,之后A方法中调用B方法进行delete操作,A,B方法都受事务控制。在B方法往外抛异常,A方法中catch了异常,事务管理就会认为没有异常,而提交事务。



 

第五个场景

同一个BO类的两个方法中,A方法中进行create操作,之后A方法中调用B方法进行delete操作,A,B方法都受事务控制。在B方法往外抛异常,A方法继续往外抛异常,事务管理就会认为方法异常,而回滚事务。



 

第六个场景

xxxBO类中,执行create方法,之后在create方法中调用yyyBO类中的delete方法,方法都受事务控制,那么yyyBO的方法就会进行事务合并。

在yyyBO的delete方法中抛异常,但是被自己catch住了,没有往外抛异常,

由于xxxBO没有往外抛异常,事务管理就会认为方法没有异常,而提交事务。



 

第七个场景

xxxBO类中,执行create方法,之后在create方法中调用yyyBO类中的delete方法,方法都受事务控制,那么yyyBO的方法就会进行事务合并。

在yyyBO的delete方法中往外抛异常,在xxxBO的create方法中catch了异常,

事务管理认为方法没有异常,进行事务提交,但是事务在yyyBO的delete方法中,已经被标识为rollback-only,所以最后事务还是发生回滚



 

第八个场景

xxxBO类中,执行create方法,之后调用yyyBO类中的delete方法,方法都受事务控制,那么yyyBO的方法就会进行事务合并。

在yyyBO的delete方法中往外抛异常,在xxxBO的create方法中往外抛异常,事务管理就发现方法异常,回滚事务。



 

总结:方法只有往外抛异常了,事务管理器才会回滚事务。如果事务传播合并了,那么内层的方法抛异常,整体事务就会回滚,不管你是否在外层方法catch了异常。

  • 大小: 37 KB
  • 大小: 51.3 KB
  • 大小: 51.8 KB
  • 大小: 54.1 KB
  • 大小: 57.1 KB
  • 大小: 53.2 KB
  • 大小: 63 KB
  • 大小: 61.2 KB
分享到:
评论

相关推荐

    spring声明式事务配置

    ### 标题解读:Spring声明式事务配置 Spring框架提供了两种主要类型的事务管理方式:编程式事务管理和声明式事务管理。声明式事务管理通过XML配置或注解的形式定义事务边界,使得业务逻辑与事务控制分离。 ### ...

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

    以下是关于Spring声明式事务配置管理的详细说明: 1. **事务管理器配置**: 在`/WEB-INF/applicationContext.xml`文件中,我们需要定义一个事务管理器Bean。通常,对于Hibernate,我们会使用`...

    spring编程式事务与声明式事务详解[参照].pdf

    Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 **编程式事务管理**是通过编写代码来显式地管理事务的开始、提交、回滚等操作。在Spring中,可以使用PlatformTransactionManager接口的实现...

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

    声明式事务管理是Spring最常用的方式,它将事务管理与业务逻辑解耦,通过AOP(面向切面编程)实现。主要有两种实现方式: - **基于XML的声明式事务管理** 在Spring的配置文件中,通过`<tx:advice>`标签定义事务...

    spring2.0声明式事务

    ### Spring 2.0 声明式事务配置详解 #### 一、Spring 2.0 声明式事务概述 随着 Spring 框架的发展,从 Spring 1.x 到 Spring 2.0 版本,声明式事务管理方式有了显著改进。在 Spring 1.x 中,主要通过 AOP 方式实现...

    Spring事务详解

    总结来说,Spring的事务管理是其强大功能的重要组成部分,通过声明式事务管理,我们可以轻松地在代码中实现事务控制,同时保持代码的简洁性和可维护性。了解和熟练掌握Spring事务管理,对于提升Java企业级应用的稳定...

    spring事务详解

    3. 声明式事务管理:利用Spring AOP的特性,Spring支持声明式事务管理,即可以在配置文件或注解中声明事务属性,这使得事务管理更加灵活和方便。 Spring的事务管理还提供了强大的事务传播行为和隔离级别配置,...

    Spring的编程式事务和声明式事务详解

    Spring框架提供了两种事务管理机制:编程式事务和声明式事务。编程式事务是通过编写代码来管理事务,声明式事务则是通过配置文件或注解来管理事务。 事务属性 Spring的事务属性是通过TransactionDefinition接口...

    Spring ax/aop声明式事务配置实例

    在Spring框架中,AOP(面向切面编程)和声明式事务管理是两个核心特性,它们极大地简化了Java企业级应用中的事务处理。本实例将深入探讨如何在Spring中使用AOP来实现声明式事务配置。 一、Spring AOP基础 AOP允许...

    Spring 事务详解面试

    相比声明式事务(Declarative Transactions), 编程式事务允许更细粒度的控制,包括在运行时决定何时开始、提交或回滚事务。这种灵活性特别适合复杂的业务逻辑和需要动态处理的场景。 声明式事务是通过配置文件或...

    Spring中事务的传播属性详解

    Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其简洁性和易用性而更受欢迎。本文将详细介绍Spring中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### ...

    spring高级编程详解

    #### 二、Spring声明式事务简介 Spring框架的声明式事务管理主要通过AOP(面向切面编程)来实现。这种方式允许开发者通过简单的注解或XML配置来定义事务边界,而无需显式地编写事务管理代码。Spring的声明式事务...

    spring事务配置详解

    Spring 提供了多种方式来配置事务管理,主要分为编程式事务管理和声明式事务管理。下面将详细介绍这五种Spring 事务配置方式。 1. **基于AOP代理的声明式事务** 这是最常见的配置方式,通过AOP代理在方法调用前后...

    Hibernate缓存与spring事务详解

    2. **声明式事务管理** - 更常见的做法是使用`@Transactional`注解,Spring AOP会在方法执行前后自动处理事务的开始、提交、回滚等操作,简化代码且易于维护。 3. **事务传播行为** - `@Transactional`的...

    spring框架,技术详解及使用指导

    AOP提供了声明式事务管理,使得事务处理代码与业务逻辑分离。 4. **MVC(Model-View-Controller)**:Spring MVC是Spring提供的用于构建Web应用的模块。它分离了模型、视图和控制器,使得应用结构更清晰,便于开发...

Global site tag (gtag.js) - Google Analytics