Spring事务的传播行为解析

 更新时间:2023年10月12日 08:30:31   作者:沐雨金鳞  
这篇文章主要介绍了Spring事务的传播行为解析,事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行,需要的朋友可以参考下

一、什么是事务传播行为?

事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何运行。

例如:methodA方法调用methodB方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。

  二、事务的7种传播行为

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性。

7种:(required / supports / mandatory / requires_new / not supported / never / nested)

  1. PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这是最常见的选择,也是Spring默认的事务传播行为。(required需要,没有新建,有加入)
  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。(supports支持,有则加入,没有就不管了,非事务运行)
  3. PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。(mandatory强制性,有则加入,没有异常)
  4. PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。(requires_new需要新的,不管有没有,直接创建新事务)
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。(not supported不支持事务,存在就挂起)
  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。(never不支持事务,存在就异常)
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。(nested存在就在嵌套的执行,没有就找是否存在外面的事务,有则加入,没有则新建)

对事务的要求程度可以从大到小排序:mandatory / supports / required / requires_new / nested / not supported / never

三、实战

1、描述

  • 外围无事务,内部有事务,外围管不着内部
    @Test
    void test_PROPAGATION_REQUIRED() {
        // add方法 @Transactional(propagation = Propagation.REQUIRED)
        userService.add(user);
        // add方法 @Transactional(propagation = Propagation.REQUIRED)
        userRoleService.add(userRole);
        //抛异常,不影响上面的add方法执行,外部异常不影响内部
        throw new RuntimeException();
    }

2、描述

  • 外围方法Propagation.REQUIRED
  • 内部方法Propagation.REQUIRED
  • 修饰的内部方法会加入到外围方法的事务中
  • 内部方法和外围方法均属于同一事务,只要一个方法回滚,整个事务均回滚
    @Transactional  // 默认Required
    @Test
    void test_PROPAGATION_REQUIRED() {
        // 增加用户表 Required 加入了外部事务
        userService.add(user);
        // 增加用户角色表 Required 加入了外部事务
        userRoleService.add(userRole);
        //抛异常 所有都回滚
        throw new RuntimeException();
    }

3、描述

支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行外围方法没有开启事务,add方法直接无事务执行

    @Test
    void test_PROPAGATION_SUPPORTS() {
        // 增加用户表 @Transactional(propagation = Propagation.SUPPORTS)
        userService.add(user);
        // 增加用户角色表 @Transactional(propagation = Propagation.SUPPORTS)
        userRoleService.add(userRole);
        //抛异常,当前无事务,直接无事务执行
        throw new RuntimeException();
    }

4、描述

  • 外围加入事务,默认Propagation.REQUIRED
  • 内部使用Propagation.SUPPORTS
  • 内部发现有事务,加入,外部异常,内部回滚

5、描述

  • 支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常
  • 外围不存在事务
  • 内部add方法使用@Transactional(propagation = Propagation.MANDATORY)
  • 内部发现当前没事务,直接抛出异常

到此这篇关于Spring事务的传播行为解析的文章就介绍到这了,更多相关事务的传播内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java使用归并删除法删除二叉树中节点的方法

    java使用归并删除法删除二叉树中节点的方法

    这篇文章主要介绍了java使用归并删除法删除二叉树中节点的方法,实例分析了java二叉树算法的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Java面向对象特性详解之封装篇

    Java面向对象特性详解之封装篇

    Java是一种广泛使用的面向对象编程语言,它支持封装、继承和多态等核心概念,这些都是面向对象编程范式的重要组成部分,这篇文章主要介绍了Java面向对象特性详解之封装篇的相关资料,需要的朋友可以参考下
    2025-12-12
  • 基于OpenCV与JVM实现矩阵处理图像

    基于OpenCV与JVM实现矩阵处理图像

    本文主要介绍了Java图像处理实战之基于OpenCV与JVM实现矩阵处理图像。文中的示例代码讲解详细,对我们学习图像处理有一定的帮助,感兴趣的可以试一试
    2022-01-01
  • 深入介绍Spring框架及故障排除

    深入介绍Spring框架及故障排除

    这篇文章主要介绍了深入介绍Spring框架及故障排除,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java数据结构与算法之插值查找解析

    Java数据结构与算法之插值查找解析

    这篇文章主要介绍了Java数据结构与算法之插值查找解析,插值查找算法类似于二分查找,不同的就是插值查找每次从自适应mid处开始查找,需要的朋友可以参考下
    2023-12-12
  • SpringSecurity中的EnableWebSecurity注解启用Web安全详解

    SpringSecurity中的EnableWebSecurity注解启用Web安全详解

    这篇文章主要介绍了SpringSecurity中的EnableWebSecurity注解启用Web安全详解,@EnableWebSecurity是Spring Security用于启用Web安全的注解,典型的用法是该注解用在某个Web安全配置类上,实现了接口,需要的朋友可以参考下
    2023-12-12
  • Spring MVC中的Controller进行单元测试的实现

    Spring MVC中的Controller进行单元测试的实现

    本文主要介绍了如何对Spring MVC中的Controller进行单元测试的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • SpringBoot3使用Swagger3的示例详解

    SpringBoot3使用Swagger3的示例详解

    本文介绍了如何在Spring Boot 3项目中使用Swagger3进行后端接口的前端展示,首先,通过添加依赖并配置application.yml文件来快速启动Swagger,然后,详细介绍了Swagger3的新注解与Swagger2的区别,并提供了一些常用注解的使用示例,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Spring Boot3 跨域配置 Cors的方式

    Spring Boot3 跨域配置 Cors的方式

    这篇文章主要介绍了Spring Boot3 跨域配置 Cors,通过使用CORS,开发人员可以控制哪些外部网页可以访问他们的资源,从而提高应用程序的安全性,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Java实现后台发送及接收json数据的方法示例

    Java实现后台发送及接收json数据的方法示例

    这篇文章主要介绍了Java实现后台发送及接收json数据的方法,结合实例形式分析了java针对json格式数据的传输与操作相关技巧,需要的朋友可以参考下
    2018-12-12

最新评论