@Transactional事务嵌套,失败情况分析

2023-11-04

@Transactional事务失败情况分析

使用声明式注解事务,Spring扫描到带有@Transactional的方法,对其进行代理增强(AOP切面,调用方法前begin,方法结束后commit),当调用了一个未被增强的方法A(无事务注解),内部又调用了一个有事务注解的方法B,由于A是被代理的B并未被代理,所以B没有被增强(即使有事务),相反,如果代理了有事务注解的方法,那么内部无论是否有注解都会被事务包含在内。

个人理解,有不对的地方请帮忙矫正.

//伪代码
  Transactional.begin
  A(有事务,被增强) 内部调用-> B(无论有没有事务,在不在同一个类,都会被增强)
  Transactional.commit

  A(无事务) 内部调用->B(同类B不增强(未被代理),不同类B会被增强(被代理),A不会)

第一种情况

同一个类A调用B在都有事务的情况下,B出错,AB全部回滚,事务成功
在这里插入图片描述

第二种情况

同一个类,去掉外层A的事务,B依然有事务,B事务未生效,name成功被修改为22222。

相反去掉内层B的事务开启外层A的事务,事务成功
在这里插入图片描述
结合第一第二种情况来讲,只要最外层有事务,内部不需要加不加事务都会被外层影响,内部如果出错整体都会回滚

第三种情况

这种情况下,在test2事务顺利的情况下,B抛异常,无外层事务,name被修改为22222。

如果test2抛出了异常,在外层无事务的情况下,name被修改为了11111,B并未被调用。
在这里插入图片描述

第四种情况

外层有事务,test2中无事务且抛异常,B未被执行,事务成功,完成回滚
在这里插入图片描述
总结一下就是,
1.当在同一个类中 外层有事务的情况下,内层无论是否加事务,事务都会成功
2.当在同一个类中外层无事务的情况下,内层无论是否有事务,事务都会失败
3.当在不同类中 外层有事务的情况下,内层无论是否有事务,事务都会成功
4.当在不同类中外层无事务的情况下,内层有事务,内层回滚,外层事务失败

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Transactional事务嵌套,失败情况分析 的相关文章

随机推荐

  • vue封装自己的组件库 02.封装dialog组件

    link https blog csdn net weixiaowei 2016 article details 104702793 四 封装一个element ui风格的dialog组件 前置知识 vue过渡动画 sync修饰符 具名插槽
  • linux集群高可用--crm

    一 高可用集群介绍 入门 http blog csdn net tjiyu article details 52643096 高可用集群的概念 非常重要 需要重点理解 什么是高可用集群 高可用集群 High Availability Clu
  • PCIE金手指各个引脚的定义及设计建议,避免入坑!

    最近在做一个PCIE转网口的项目 具体框图如下 SOC这边的板子是我们自己开发的 但是无法满足输出四个网口的需求 就想到了用PCIE2 0进行转接 右侧的网口扩展板是外购的 刚好满足PCIE2 0接口 并输出四路网口 于是采用了此架构进行设
  • 嵌入式相关开源项目、库、资料

    学习初期最难找的就是找学习资料了 本文精心汇总了一些嵌入式相关资源 包括但不限于编程语言 单片机 开源项目 物联网 操作系统 Linux 计算机等资源 并且在不断地更新中 致力于打造全网最全的嵌入式资料库 以下为最新资料汇总 github
  • 网页自动点击系统 (自动签到)

    Selenium是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE 7 8 9 10 11 Mozilla Firefox Safari Google Chrome O
  • YOLOv3计算模型的mAP

    一 先测试一下大神的数据 在这里下载 https github com Cartucho mAP 1 解压之后如下图所示 input文件夹里面放的是测试集的ground truth 模型的测试结果 和测试集 scripts文件夹里面放的是一
  • 关于数据库的总结

    1 SQL MySQL SQLite简介 SQL 发音为字母S Q L或sequel 是结构化查询语言 Structured Query Language 的缩写 SQL是一种专门用来与数据库通信的语言 数据的所有存储 检索 管理和处理实际
  • 信息安全建设之安全平台搭建

    我们在进行网络安全层面体系建设的时候 需要涉及到很多安全产品 UTM 统一威胁管理 称为集成威胁管理 是安全措施之一 我们的目标是通过整合从而实现高效运营 而不是威胁组织网络的各种风险和管理设备 它不仅仅是针对外部组织的病毒防护和各种不断演
  • 【排序算法】插入排序(C语言)

    排序算法 插入排序 目录 一 插入排序的基本思想 二 插入排序的单趟排序 1 直接插入排序 2 二分法插入排序 三 插入排序的特点和效率 1 插入排序的特点 2 插入排序的效率 一 插入排序的基本思想 直接插入排序是一种简单的插入排序法 对
  • MAGMA

    LAPACK GPU MAGMA 使用gotoblas2 CUDA安装magma1 1 0 227 准备阶段 1 安装CUDA 2安装cpu BLAS 3安装LAPACK 安装过程 1 按照README文档进行安装 2 在make inc
  • 一份超详细的SpringMVC4常用知识清单!

    文章目录 1 SpringMVC 概述 2 使用 RequestMapping 映射请求 2 1 映射请求参数 请求方法或请求头 2 2 Maping支持通配符 3 PathVariable 映射 URL 绑定的占位符 4 REST 5 请
  • SVN查看文件的修改记录

    命令查看某个文件的修改历史 修改完某个文件后 要看改动的话使用如下命令 svn diff xxx xxx xx m svn diff 文件路径 如果要查看某次历史的提交的所有修改记录的话使用如下命令 svn diff c r12347
  • 基本类型题小结

    1 java基本数据类型 答 byte short int long float double char boolean 2 java数组声明方式 答 第一种方式 int a1 new int 1 2 3 直接声明并赋值 直接声明赋值数组是
  • python读取excel文件的单元格内容,去掉内容前个text

    打印的内容前有个text 对应的代码为 这个表示的是它内容的属性 加入你print的这个对象叫cell a 解决方法 可直接取中间的元素 cell a value就可以了 结果呈现
  • 【云原生之kubernetes实战】在k8s环境下部署OneNav个人书签工具

    云原生之kubernetes实战 在k8s环境下部署OneNav个人书签工具 一 OneNav介绍 1 OneNav简介 2 OneNav特点 二 检查本地k8s环境 1 检查工作节点状态 2 检查系统pod状态 三 docker部署One
  • 小朋友崇拜圈

    9 3 4 2 5 3 8 4 6 9 4 include
  • [SQL

    目录 一 环境安装 二 环境配置 三 编写程序 一 环境安装 1 PostgreSQL10 23 X64 应该哪个版本都行 1 由于使用 EXEC SQL 这种嵌入方式已经非常古老 近些年的Mysql和SQL Server都已经不支持这种嵌
  • android 5.1 非STR待机流程

    android在长按Power键 手机或pad 或按下电源键 电视 会进入待机状态 下面分析一下非STR待机流程 待机分STR和非STR待机 STR待机是为了实现快速开关机 提高开机速度 android自身支持STR OEM可以根据自身需要
  • 1g服务器跑项目,云服务器1核1g跑Java项目

    云服务器1核1g跑Java项目 内容精选 换一换 简要介绍Tomcat服务器是一个免费的开放源代码的Web应用服务器 属于轻量级应用服务器 在中小型系统和并发访问用户不多等场合下被普遍使用 是开发和调试JSP程序的首选 语言 Java一句话
  • @Transactional事务嵌套,失败情况分析

    Transactional事务失败情况分析 使用声明式注解事务 Spring扫描到带有 Transactional的方法 对其进行代理增强 AOP切面 调用方法前begin 方法结束后commit 当调用了一个未被增强的方法A 无事务注解