关于事务的传播,我们先确定一个场景:方法A调用方法B,方法A可能存在事务,也可能不存在事务,我们这里重点关注方法B上定义的事务传播行为,以及方法B中出现异常时,方法A应该如何处理事务的提交或回滚(如果存在)。



    @Autowired private ServiceB serviceB;

    public void methodA() {
// do anything
serviceB.mehtodB();
// do anything
} @Transactional(propagation = Propagation.NESTED)
public void mehtodB() {
// do anything
}

事务的传播行为类型

1 .PROPAGATION_REQUIRED(默认实现)

方法B的执行需要有事务,如果方法A有事务,那么方法B加入方法A的事务,方法A或B的异常都会导致整个事务回滚。

2 .PROPAGATION_SUPPORTS

方法B的执行支持事务,如果方法A存在事务,那么方法B加入方法A的事务,否则方法B以无事务的方式执行。此情景下,A方法事务回滚也将导致方法B回滚,方法A无事务则不影响。

3 .PROPAGATION_MANDATORY

方法B强制必须在事务条件下执行,方法B加入方法A的事务执行,如果方法A无事务,则抛出异常。

4 .PROPAGATION_REQUIRES_NEW

方法B必须在新事务中执行,如果A存在事务,那么把方法A的事务挂起;此种情境下,方法A和方法B的回滚不会影响到对方。

5 .PROPAGATION_NOT_SUPPORIED

方法B必须在无事务条件下执行,如果方法A存在事务,那么需要将方法A的事务挂起。

6 .PROPAGATION_NEVER

方法B必须在不存在事务的条件下执行,如果方法A存在事务,则抛出异常。

7 .PROPAGATION_NESTED

这里我们需要了解下嵌套事务的提交

  • 我们把嵌套事务视作一棵树,根节点事务叫做顶层的事务,其它事务是顶层事务的子事务;
  • 任何嵌套的子事务的提交和回滚,都必须在它的父事务提交后进行;嵌套的子事务可以独立于当前事务进行单独地提交或回滚;
  • 任何父事务的回滚都会导致它的所有子事务的回滚。

嵌套事务,如果方法A存在事务,那么方法B的创建一个方法A事务的嵌套事务(从数据库的层面看,也可视为子事务),如果方法A不存在事务,那么行为与PROPAGATION_REQUIRED相同。

此处,父事务的回滚行为会导致子事务回滚;而子事务的回滚和提交独立于父事务。

注意事项

  • 非public 方法会导致事务失效

  • 事务默认的异常类型是: RuntimeException

spring事务的传播的更多相关文章

  1. Spring事务的传播行为 @Transactional(转)

    Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例 ...

  2. Spring事务的传播行为 @Transactional

    Spring事务的传播行为http://blog.csdn.net/cuker919/article/details/5957209 在service类前加上@Transactional,声明这个se ...

  3. Spring事务的传播特性和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  4. Spring事务的传播行为

      本文主要介绍下Spring事务中的传播行为. 事务传播行为介绍 Spring中的7个事务传播行为: |事务行为|说明 | |:--|:--| |PROPAGATION_REQUIRED | 支持当 ...

  5. Spring事务的传播:PROPAGATION_REQUIRED

    PROPAGATION_REQUIRED-- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. ServiceA { void methodA() { ServiceB.method ...

  6. Spring事务的传播行为分析

    前言 最近项目有涉及到Spring事务,所以工作之余,想认真了解学习下Spring事务,查阅了若干资料,做了一个demo(PS:参考了大牛的). 现分享总结如下: 1.Spring 事务的简介 理解事 ...

  7. 关于事务,事务的特性,spring事务的传播特性

    1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...

  8. 数据库的特性与隔离级别和spring事务的传播机制和隔离级别

    首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离 ...

  9. Spring事务管理-传播行为-隔离级别

    事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败. 事务的特性:ACID 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 一致性:事务前后数据的完整性约束保持一致 ...

  10. Spring事务之传播机制

    Spring事务传播机制:Spring在TransactionDefinition接口中规定了种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套时事务如何进行传播.即协调已经有事务标识的方法之 ...

随机推荐

  1. [转帖]Linux搭建Nexus仓库+高可用方案

    https://www.cnblogs.com/yangjianan/p/9090348.html Linux搭建nexus仓库 1.安装jdk 1.1 获取安装包,解压到指定目录: 1 tar xf ...

  2. [转帖]修改vcenter数据库账号密码

    1.修改sqlserver sa账号密码 2.停止vcenter服务 cd C:\Program Files\VMware\vCenter Server\bin service-control --l ...

  3. ChatGPT 提高工作效率-一例SQL编写的过程

    ChatGPT 提高工作效率-一例SQL编写的过程 前言 遇到一个问题, 怀疑是有一些补丁没有被依赖. 导致第一次更新时没有更新这些没依赖的补丁. 后面更新时又更新了这些游离态的补丁. 导致出现 ol ...

  4. [转帖]ARMv8架构概述、相关技术文档以及ARMv8处理器简介

    ARMv8架构 文章目录 ARMv8架构 参考文档 ARMv8架构的概述 从32位到64位的变化The changes from 32 bits to 64 bits 1,Larger registe ...

  5. Linux 排除某些目录下 重复jar包的方法

    Linux 排除某些目录下 取重复jar包的方法 find . -path ./runtime/java -prune -o -name '*.jar' -exec basename {} \;| s ...

  6. Rendezvous hashing算法介绍

    Rendezvous hashing Rendezvous hashing用于解决分布式系统中的分布式哈希问题,该问题包括三部分: Keys:数据或负载的唯一标识 Values:消耗资源的数据或负载 ...

  7. 一文详解 Netty 组件

    作者:京东物流 张弓言 一.背景 Netty 是一款优秀的高性能网络框架,内部通过 NIO 的方式来处理网络请求,在高负载下也能可靠和高效地处理 I/O 操作 作为较底层的网络通信框架,其被广泛应用在 ...

  8. C# await和Result对比

    1.Result 上图是微软官网的截图,由图可知在使用GetXXXX的方法的时候,会阻塞调用其他线程,直到当前异步操作完成,相当于调用wait方法.但是使用异步编程应该避免使用TASK.WAIT或TA ...

  9. SqlSugar的Repository

    1.仓储说明 仓储可以让你的方法更加的规范,需要什么方法都封装到仓储中,下次就能重复使用,并且能很好的和你业务拆分开 这种设计模式简单粗暴用起来也方便 ,文章下面有可以运行的DEMO 2.仓储方法 仓 ...

  10. MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)

    MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA).实现包括二次预训练.有监督微调.奖励建模.强化学习训练[LLM:含Ziya-LLaMA]. **** 训练医疗大模型,实现包 ...