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 的编程式事务管理及声明式事务管理,帮助读者理清思路。 事务管理的重要性 事务管理对于企业应用至关重要。它保证了用户的每一次操作都是可靠的,即便...
### 标题解读: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框架作为Java企业级开发的首选,其事务管理模块是实现业务逻辑可靠性和数据一致性的重要组成部分。Spring支持两种事务管理方式:编程式事务管理...
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应用的模块。它分离了模型、视图和控制器,使得应用结构更清晰,便于开发...