首页 > 其他分享 >Spring 事务传播行为

Spring 事务传播行为

时间:2022-11-18 21:14:22浏览次数:50  
标签:事务 REQUIRES -- Spring 回滚 传播 PROPAGATION 异常

事务传播行为指当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播,例如,方法可能继续在当前事务中执行,也可以开启一个新的事务,在自己的事务中执行。
声明式事务的传播行为可以通过 @Transactional 注解中的 propagation 属性来定义。

一、事务传播方式

  • PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

二、PROPAGATION_REQUIRES_NEW与PROPAGATION_NESTED的理解

  1. PROPAGATION_REQUIRES_NEW: 启动一个新的, 不依赖于环境的 "内部" 事务。 这个事务commit或 rollback 不依赖于外部事务,它拥有自己的隔离范围。当内部事务开始执行时,外部事务将被挂起,内部事务结束时,外部事务将继续执行。

    • 内部方法选择REQUIRES_NEW会新开启事务,外层事务不会影响内部事务的提交/回滚

    • 内部方法选择REQUIRES_NEW,当内部事务的发生异常,会影响外部事务的回滚

  2. PROPAGATION_NESTED: 开始一个 "嵌套的" 事务,它是已经存在事务的一个真正的子事务。嵌套事务开始执行时,它将取得一个 savepoint。如果这个嵌套事务失败, 我们将回滚到此savepoint。嵌套事务是外部事务的一部分,只有外部事务结束后它才会被提交。

    • 内部事务执行发生异常,外层事务不处理异常,外层事务和内层事务会一起回滚
    • 内部事务执行发生异常,外层事务处理异常,外层事务正常提交,但内层事务会回滚

三、REQUIRED、REQUIRES_NEW、NESTED的使用差异

  1. 定义serviceA.methodA() 以PROPAGATION_REQUIRED修饰;
  2. 定义serviceB.methodB() 以表格中三种方式修饰;
  3. methodA中调用methodB
异常状态 PROPAGATION_REQUIRES_NEW
(两个独立事务)
PROPAGATION_NESTED
(B的事务嵌套在A的事务中,事务对象为同一个)
PROPAGATION_REQUIRED
(同一个事务)
methodA抛异常
methodB正常
A回滚,B正常提交 A与B一起回滚 A与B一起回滚
methodA正常
methodB抛异常
1.如果A中捕获B的异常,并没有继续向上抛异常,则B先回滚,A再正常提交;
2.如果A未捕获B的异常,默认则会将B的异常向上抛,则B先回滚,A再回滚
1.如果A中捕获B的异常,并没有继续向上抛异常,则B先回滚,A再正常提交;
2.如果A未捕获B的异常,默认则会将B的异常向上抛,则B先回滚,A再回滚
A与B一起回滚
methodA抛异常
methodB抛异常
B先回滚,A再回滚 A与B一起回滚 A与B一起回滚
methodA正常
methodB正常
B先提交,A再提交 A与B一起提交 A与B一起提交

标签:事务,REQUIRES,--,Spring,回滚,传播,PROPAGATION,异常
From: https://www.cnblogs.com/qiu-rong/p/16904883.html

相关文章

  • SpringBoot整合JUnit
    这个不用自己整合,在创建好SpringBoot项目后在Test文件夹中就能找到,相关的依赖也导入进去了。这里只是进行一个详细的说明。  @SpringBootTest类型:测试类注解位置:测......
  • Spring Cloud学习
    约定大于配置大于编码  新建工作空间1.新建一个maven工程(当作总工程,下面就新建小的moudle),配置名字,包名,之类的。 出现这个爆红找不到插件‘maven-clean-plugin:......
  • springboot+minio实现分片上传(超大文件快速上传)
    ​ 设计由来在实际的项目开发中常遇到超大附件上传的情况,有时候客户会上传GB大小的文件,如果按照普通的MultipartFile方式来接收上传的文件,那么无疑会把服务器给干崩......
  • Spring Boot集成日志框架
    日志框架一、日志的作用日志(Log)的作用:开发调试:在开发过程中,进行逻辑跟踪、查看运行结果问题排查:辅助排查和定位线上问题,优化程序运行性能状态监控:监控系统的运行......
  • 框架进行时——SpringMVC流程简析(一)
    基于SpringWeb(5.3.23)的接口请求分析前情提要假定当前Web项目中有如下实体类和接口:packagecom.example.entity;publicclassWebUser{privateStringname;......
  • SpringBoot提供的三种配置文件格式
    1、application.properties(传统格式/默认格式)e.g.server.port=80 2、application.yml(主流格式、推荐使用)e.g.server:  port:81 3、application.yamle.g.ser......
  • springboot大文件上传、分片上传、断点续传、秒传的实现
    ​对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程......
  • SpringBoot基础配置
    属性配置1、修改配置例子:(1)修改服务器端口server.port=80;(2)关闭运行日志图标(banner)spring.main.banner-mode=off(3)设置日志相关logging.level.root=debug SpringB......
  • 如何快速优化事务性(OLTP)SQL Server性能?
    如我们所知,事务性(OLTP)SQLServer是很大部分医疗机构会选择的数据库之一,使用频率很高,发生卡、慢的机率也随之增加,那我们如何快速的对它进行性能优化呢?下面我们将利用几个重......
  • 9.springboot项目tomcat换undertow或jetty
    1.1排除tomcat容器<!--1.排除tomcat--><exclusions><exclusion><artifactId>spring-boot-starter-tomcat</artifactId><groupId>org.springframework.boot......