spring事务默认传播机制REQUIRED的试验(手动开启事务代码+feign远程调用)

@transactional注解,默认啥都不指定的时候,我们使用的就是PROPAGATION_REQUIRED这种方式。

PROPAGATION_REQUIRED:业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务。这是spring默认的传播行为。

翻译一下就是:看一下调用我的上层方法有没有事务,有的话,就舍弃我的事务,加入上层方法的事务中去.

往往很多小伙伴在使用声明式事物的时候,大部分使用的就是这种默认的传播方式,就顶多加上一个异常指定@Transactional(rollbackFor = Exception.class)

试验一:一个方法调另两个方法,这个方法没加@transactional,那两个方法上都加了@transactional,那么创建了几个sqlsession,共有几个事务

试验得知,bb()方法一个sqlsession,一个事务.cc()方法一个sqlsession,一个事务.

一共两个sqlsession,  一个sqlsession对应一个事务,一共两个事务.

先创建一个sqlsession执行完后就把它关闭,

然后第二个sqlsession再被创建.

 

试验二:一个方法调另两个方法,这三个方法上都加了@transactional注解,那么创建了几个sqlsession,共有几个事务 

下面这种情况触发了spring事务的默认传播机制REQUIRED,就是如果上层存在事务,那么就舍弃自己的事务,加入上层的事务.

试验得知,下面的情况就是bb()和cc()方法的事务被舍弃了,就只有aa()的事务是生效的.

也就是只剩下aa()方法创建了一个sqlsession,  一个sqlsession对应一个事务,一共一个事务.

 试验三:feign远程调用的话会对事务的默认传播机制有影响吗

试验得知:feign远程调用会阻挡事务的默认传播.

本来上层方法order服务aa()有事务,user服务aa()方法应该舍弃自己的事务并加入order服务aa()的事务,但是现在由于feign远程调用阻断了事务的传播,导致现在user服务aa()的事务没有舍弃,依然独立存在着.导致现在order服务aa()有个事务,user服务aa()的也有个事务.

order服务的aa()方法创建了一个sqlsession,  一个sqlsession对应一个事务

user服务的aa()方法创建了一个sqlsession,  一个sqlsession对应一个事务

也就是说下面的代码一共创建了2个sqlsession,  2个事务.

 

试验四:手动开启事务会对事务的默认传播机制有影响吗 

试验得知:手动开启事务代码并不会影响到事务的默认传播机制.手动开启事务代码和@transactional注解是兼容的.

下面是试验:

手动事务 注入两个bean

@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
@Autowired
TransactionDefinition transactionDefinition;
手动开启事务
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
手动提交事务
dataSourceTransactionManager.commit(transactionStatus);//提交
手动回滚事务
dataSourceTransactionManager.rollback(transactionStatus);//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交

上面的这种手动开启事务的方式,也会和直接加@transactional注解的事务的传播效果是一样的吗

开始试验:

情况一:将上层方法aa()改为手动开启事务代码.

运行代码发现,整个过程只创建了一个sqlsession,  一个sqlsession对应一个事务,证明手动开启事务代码并没有对事务的默认传播造成影响.手动开启事务代码和@transactional注解是兼容的.

情况二:将下层方法cc()改为手动开启事务代码.

运行代码发现,整个过程只创建了一个sqlsession,  一个sqlsession对应一个事务,证明手动开启事务代码并没有对事务的默认传播造成影响.手动开启事务代码和@transactional注解是兼容的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++20新特性解析:深入探讨协程库的实现原理与应用

C20新特性解析:深入探讨协程库的实现原理与应用 一、C20的协程库简介二、C20协程基础知识2.1、协程的基本概念和使用方法2.2、C20中的协程支持2.3、协程与传统线程的对比 三、C20协程库的实现原理四、C20协程库的应用实例总结 一、C20的协程库简介 C20引入了对协程…

特种印制电路技术

1特种印制电路技术现状、分类及特点 2006年,信息产业部(现工信部)电子信息产品管理司将高档PCB产品类型概括为HDI板、多层FPC、刚挠结合板、IC载板、通信背板、特种板材印制板、印制板新品种等种类。但直至目前,在印制电路设计与制造领域还没有形成特种…

软件测试|深入理解SQL RIGHT JOIN:语法、用法及示例解析

引言 在SQL中,JOIN是一种重要的操作,用于将两个或多个表中的数据关联在一起。SQL提供了多种JOIN类型,其中之一是RIGHT JOIN。RIGHT JOIN用于从右表中选择所有记录,并将其与左表中匹配的记录组合在一起。本文将深入探讨SQL RIGHT …

Python Selenium常见的报错以及措施

Python Selenium的常见报错主要包括以下几种: 1. NoSuchElementException: 当Selenium无法在DOM中找到元素时,会抛出此异常。这通常是因为元素不存在或者页面还未完全加载。 解决方法: 显式等待 隐式等待 越快越慢,越慢越快&#…

C#,冒泡排序算法(Bubble Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是:简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显,一般使用递归方式实现,但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

并发(6)

目录 31.JUC框架包含几个部分? 32.Lock框架和Tools包含哪些核心的类? 33.JUC原子类有哪些核心的类? 34.JUC线程池有哪些核心的类? 35.线程安全的实现方法有哪些? 31.JUC框架包含几个部分? 主要包含&am…

SpringCloud-高级篇(十三)

前面的主从集群可以应对Redis高并发读的问题,Redis主从之间可以做同步,为了提高主从同步时的性能,单节点Redis的内存不要设置太高,如果内存占用过多,做RDB的持久化,或者做全量同步的时候,导致大…

LDD学习笔记 -- Linux错误码

LDD学习笔记 -- Linux错误码 EACCES(Permission Denied) 13EEXIST(File Exits) 17EINVAL(Invalid Argument) 22ENOENT(No Such File or Directory)ENOMEM(Out of Memory)EIO(Input/Output Error) 5ENOSPC(No space Left on Device)ENOTTY(Not a Typewrite)EPIPE(Broken Pipe)EI…

使用邮箱发送验证码前端完成登录

前言 在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。 接口 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int count { get; set; }pu…

元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata

大家好,我是独孤风。元数据管理平台层出不穷,但目前主流的还是Atlas、Datahub、Openmetadata三家,那么我们该如何选择呢? 本文就带大家对比一下,这三个平台优势劣势。要了解元数据管理平台,先要从架构说起。 正文共&am…

【北邮国院大四上】Business Technology Strategy 企业技术战略

北邮国院电商大四在读,本笔记仅为PPT内容的整理与翻译,并不代表本课程的考纲及重点,仅为本人复习时方便阅读与思考之作。 写在前面 大家好,欢迎来到大学期间的最后一门课程,本门课程是中方课,所以很庆幸的…

【Apollo】阿波罗使用占位符 #{} 的异常分析

文章目录 1. 前言2. 复现3. 分析3.1 Value 注解3.2 根因 4. 后记5. 参考资料 1. 前言 出于线上 hotfix 报文请求模板的考虑,新增一个阿波罗配置,取值形如: 发布配置一段时间后,刚好需要重启服务,最终造成服务宕机&a…

在Ubuntu22.04上安装WordPress

WordPress是当今最简单、最强大的博客和网站建设工具。据统计全球大约有40% 以上网站是使用WordPress,这是个巨大的数字也侧面证明了WordPress的强大和普遍性。因此,如果你正在寻找一款高效、实用、可靠的CMS工具来构建网站,那么WordPress无疑…

关于HAL库外部中断的开关流程

通过HAL库配置好外部中断后,会生成如下代码: static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_…

self-attention(上)李宏毅

B站视频链接 word embedding https//www.youtube.com/watch?vX7PH3NuYW0Q self-attention处理整个sequence,FC专注处理某一个位置的资讯,self-attention和FC可以交替使用。 transformer架构 self-attention的简单理解 a1-a4可能是input也可以作为中…

如何把电脑中的项目快速传进Github中?

一、打开GitHub网站:https:github.com 登录自己的个人账号 1.新建一个项目 2.用鼠标直接拖拽电脑中的项目文件夹与文件到新创建的项目中点击保存即可。

JS手写apply,call,bind函数

本篇文章咱们来手写简易版的apply,call,bind函数。 实现思路 首先咱们需要思考下这三个函数放到哪里比较合适,因为这三个函数是被函数对象调用的,并且每个函数都可以调用,所以不难想到有一个位置非常合适,…

springboot第47集:【思维导图】面向对象,关键字,标识符,变量,数组的使用...

关键字:class,public,static,void等,特点是全部关键字都是小写字母。 image.png image.png 凡是自己起的名字可以叫标识符 image.png image.png image.png image.png 整数类型的使用 image.png image.png image.png 浮点类型 image.png image.png 字符类…

用队列实现栈oj题——225

. 个人主页:晓风飞 专栏:LeetCode刷题|数据结构|Linux 路漫漫其修远兮,吾将上下而求索 文章目录 题目要求:实现 MyStack 类:注意:示例:解释:提示: 解题核心数据结构的定义…