Spring事务传播问题 — PROPAGATION_REQUIRES_NEW

2023-11-06

一、描述
Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAGATION_REQUIRES_NEW”时,
内层Service的方法被调用时,外层方法的事务被挂起;
内层事务相对于外层事务是完全独立的,有独立的隔离性等等。

二、实验
但实验时却遇到一个奇怪的问题:
1、当ServiceA.a()方法调用ServiceB.b()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响。
2、当ServiceA.a()方法调用ServiceA.c()方法时,内层事务不能正确地提交或回滚。

三、演示代码
XXXService中,有下面两个方法:
@Transactional
method_One() {
method_Two();
}


@Transactional(propagation = Propagation.REQUIRES_NEW)
method_Two(){
//do something
}

四、分析和结论
1、method_Two()会不会创建一个新事务?
答:不会创建。仔细查看了日志,没有找到类似creating new transaction的输出,应该是因为在同一个Service类中,spring并不重新创建新事务,如果是两不同的Service,就会创建新事务了。
那么为什么spring只对跨Service的方法才生效?
Debug代码发现跨Service调用方法时,都会经过org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept()方法,只有经过此处,才能对事务进行控制。

2、不同的Service调用方法时:
如果被调用方法是Propagation.REQUIRES_NEW,被catch后不抛出,事务可以正常提交;
如果被调用方法是Propagation.REQUIRED,被catch后不抛出,后面的代码虽然可以执行下去,但最终还是会分出rollback-only异常;

3、同一个Service中调用方法时:
不论注解是Propagation.REQUIRES_NEW 还是 Propagation.REQUIRED,
其结果都是一样的,就是都被忽略掉了,等于没写。
当其抛出异常时,只需catch住不抛出,事务就可以正常提交。

参考

http://blog.csdn.net/chs_jdmdr/article/details/46411879


https://segmentfault.com/a/1190000013341344



http://blog.csdn.net/Big_Blogger/article/details/70184627



http://blog.csdn.net/arsenal04/article/details/41007545



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

Spring事务传播问题 — PROPAGATION_REQUIRES_NEW 的相关文章

随机推荐

  • java语言特点和跨平台原理

    Java语言 1 java的三大版本 JavaSE J2SE java的标准版本定位在客户端 主要用于桌面应用软件的编程 JavaEE 定位在服务器端java2的企业版 主要用于分布式网络程序的开发 如电子商务网站 JavaME J2ME主
  • 实验:使用SSMS创建并管理数据库及其基本表

    目录 题目要求 1 创建数据库 2 创建三个表 3 修改限制条件 4 创建及管理约束条件 5 录入基本数据 6 数据的更改和插入 7 分离与附加数据库 题目要求 实验课程 数据库系统原理 专业 计算机科学与技术 班级 实验日期 姓名 学号
  • Qt信号与槽的各种连接方式

    信号槽是 Qt 框架引以为豪的机制之一 当用户触发某个事件时 就会发出一个信号 signal 这种发出是没有目的的 类似广播 如果有对象对这个信号感兴趣 它就会连接 connect 绑定一个函数 称为槽slot 来处理这个信号 也就是说当信
  • sklearn库简述-zstarling

    文章目录 模型的选择与评估 划分数据集 评估模型 监督学习 最近邻 支持向量机 SVM 决策树 集成方法 朴素贝叶斯 线性回归 随机梯度下降 判别分析 模型的选择与评估 划分数据集 from sklearn model selection
  • 如何更改linux文件的拥有者及用户组(chown和chgrp)

    本文整理自 http blog 163 com yanenshun 126 blog static 128388169201203011157308 http ydlmlh iteye com blog 1435157 一 基本知识 在Li
  • [C/C++] undefined reference to ‘std::cout‘

    gcc TrackersManger cpp o TrackersManger 编译时出现如下错误 原因是 编译 cpp 文件时 需要使用 g 编译 改为如下即可 g TrackersManger cpp o TrackersManger
  • 国产操作系统迎来最好时代

    在国家强力政策推动及下游需求快速提升的双重作用下 网络安全和自主可控领域正在迎来行业大爆发 能够充分防范 永恒之蓝 等外来病毒侵袭 各方面日臻成熟的国产操作系统的最好时代已经渐行渐近 不久前 基于 永恒之蓝 攻击模块衍生出的 想哭 勒索病毒
  • 在linux上替换动态库的内存变化分析

    在linux上替换动态库的内存变化 测试static变量 static string staticString 123 void queryFreezingMoney CFmlBuf inBuf CFmlBuf outBuf string
  • 使用chatGPT辅助编写测试用例

    目录 一 问答1 0版 二 问答2 0版 2 1 问答2 1 2 2 问答2 2 2 3 问答2 3 三 问答3 0版本 四 思考 个人简介 作者简介 大家好 我是凝小飞 软件测试领域作者 支持我 点赞 收藏 留言 最近开始学习和写作 请大
  • 前端基础(一):Jquery

    1 dom和jquery的互相转化 2 选择器 3 过滤器 4 DOM操作 1 dom和jquery的互相转化 dom转jquery dom对象 jquery转dom 方法一 a 0 方法二 a get 0 2 选择器 1 基本选择器 id
  • 记录一个iOS使用陀螺仪3d效果的抖动问题

    使用陀螺仪的时候 遇到一个问题 就是在拖动scrollView滚动的时候 3d效果的图片会抖动 实现3d效果的代码 void updateWithGravityX double gravityX gravityY double gravit
  • python中ord什么意思_python里ord

    广告关闭 腾讯云11 11云上盛惠 精选热门产品助力上云 云服务器首年88元起 买的越多返的越多 最高返5000元 一 ord函数介绍该函数是以单个字符作为参数 返回对应的ascll数值或者unicode值 如果所给的unicode字符超出
  • 创建多线程的四种方式

    目录儿 一 创建线程的四种方式 1 继承Thread类 2 实现Runnable接口 3 实现Callable接口 4 线程池 禁止使用 Executors 构建线程池 构建线程池的正确方式 一 创建线程的四种方式 1 继承Thread类
  • 大三,改变生活的一年

    国庆假期在偶然看到了去年假期画的stm32开发板的PCB 当时接触还没有一个月 想到了大三这一年来的点点滴滴 突然就想写下点什么 对于过去的一年的总结 又提醒自己还是给小白 要继续加油 首先我先说一下自己的情况 我是一个很普通的本科生 真的
  • 《人类染色体与染色体病》学习笔记

    染色质与染色体 染色质为细丝状 当细胞分裂时 染色质复制反复盘绕高度压缩 凝集形成兴泰特定的条状染色体 以保证DNA能准确分配到两个子细胞中 染色质和染色体的化学组成 DNA和组蛋白占染色质化学总量98 以上 染色质的种类 染色质由于其折叠
  • 消息通知系统

    using UnityEngine using System Collections using System Collections Generic public delegate void NotificationDelegate No
  • 华为OD机试真题-单词接龙-2023年OD统一考试(B卷)

    题目描述 单词接龙的规则是 可用于接龙的单词首字母必须要前一个单词的尾字母相同 当存在多个首字母相同的单词时 取长度最长的单词 如果长度也相等 则取字典序最小的单词 已经参与接龙的单词不能重复使用 现给定一组全部由小写字母组成单词数组 并指
  • hive错误:Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Permission denied

    用不同用户去登录hive 可能会报如下错误 Exception in thread main java lang RuntimeException java io IOException Permission denied at org a
  • 嵌入式开发中的通讯协议(UART、SPI、CAN、I2C)

    一 UART UART是一种通用串行数据总线 用于异步通信 该总线双向通信 可以实现全双工传输和接收 1 1接口 两根线 UART TX 发送 UART RX 接收 1 2如何传输 UART作为异步串口通信协议的一种 工作原理是将传输数据的
  • Spring事务传播问题 — PROPAGATION_REQUIRES_NEW

    一 描述Spring遇到嵌套事务时 当被嵌套的事务被定义为 PROPAGATION REQUIRES NEW 时 内层Service的方法被调用时 外层方法的事务被挂起 内层事务相对于外层事务是完全独立的 有独立的隔离性等等 二 实验但实验