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了异常。
相关推荐
### 标题解读:Spring声明式事务配置 Spring框架提供了两种主要类型的事务管理方式:编程式事务管理和声明式事务管理。声明式事务管理通过XML配置或注解的形式定义事务边界,使得业务逻辑与事务控制分离。 ### ...
以下是关于Spring声明式事务配置管理的详细说明: 1. **事务管理器配置**: 在`/WEB-INF/applicationContext.xml`文件中,我们需要定义一个事务管理器Bean。通常,对于Hibernate,我们会使用`...
Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 **编程式事务管理**是通过编写代码来显式地管理事务的开始、提交、回滚等操作。在Spring中,可以使用PlatformTransactionManager接口的实现...
声明式事务管理是Spring最常用的方式,它将事务管理与业务逻辑解耦,通过AOP(面向切面编程)实现。主要有两种实现方式: - **基于XML的声明式事务管理** 在Spring的配置文件中,通过`<tx:advice>`标签定义事务...
### Spring 2.0 声明式事务配置详解 #### 一、Spring 2.0 声明式事务概述 随着 Spring 框架的发展,从 Spring 1.x 到 Spring 2.0 版本,声明式事务管理方式有了显著改进。在 Spring 1.x 中,主要通过 AOP 方式实现...
总结来说,Spring的事务管理是其强大功能的重要组成部分,通过声明式事务管理,我们可以轻松地在代码中实现事务控制,同时保持代码的简洁性和可维护性。了解和熟练掌握Spring事务管理,对于提升Java企业级应用的稳定...
3. 声明式事务管理:利用Spring AOP的特性,Spring支持声明式事务管理,即可以在配置文件或注解中声明事务属性,这使得事务管理更加灵活和方便。 Spring的事务管理还提供了强大的事务传播行为和隔离级别配置,...
Spring框架提供了两种事务管理机制:编程式事务和声明式事务。编程式事务是通过编写代码来管理事务,声明式事务则是通过配置文件或注解来管理事务。 事务属性 Spring的事务属性是通过TransactionDefinition接口...
在Spring框架中,AOP(面向切面编程)和声明式事务管理是两个核心特性,它们极大地简化了Java企业级应用中的事务处理。本实例将深入探讨如何在Spring中使用AOP来实现声明式事务配置。 一、Spring AOP基础 AOP允许...
相比声明式事务(Declarative Transactions), 编程式事务允许更细粒度的控制,包括在运行时决定何时开始、提交或回滚事务。这种灵活性特别适合复杂的业务逻辑和需要动态处理的场景。 声明式事务是通过配置文件或...
Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其简洁性和易用性而更受欢迎。本文将详细介绍Spring中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### ...
#### 二、Spring声明式事务简介 Spring框架的声明式事务管理主要通过AOP(面向切面编程)来实现。这种方式允许开发者通过简单的注解或XML配置来定义事务边界,而无需显式地编写事务管理代码。Spring的声明式事务...
Spring 提供了多种方式来配置事务管理,主要分为编程式事务管理和声明式事务管理。下面将详细介绍这五种Spring 事务配置方式。 1. **基于AOP代理的声明式事务** 这是最常见的配置方式,通过AOP代理在方法调用前后...
2. **声明式事务管理** - 更常见的做法是使用`@Transactional`注解,Spring AOP会在方法执行前后自动处理事务的开始、提交、回滚等操作,简化代码且易于维护。 3. **事务传播行为** - `@Transactional`的...
AOP提供了声明式事务管理,使得事务处理代码与业务逻辑分离。 4. **MVC(Model-View-Controller)**:Spring MVC是Spring提供的用于构建Web应用的模块。它分离了模型、视图和控制器,使得应用结构更清晰,便于开发...