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.hqwc.cn/news/329175.html

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

相关文章

NPS 内网穿透安装

NPS 内网穿透安装 NPS分为服务端和客户端,对应的不同操作系统软件可以在GitHub RELEASES自行选择下载。 服务端搭建 由于个人非企业级使用,为了方便直接使用docker安装 1.docker运行 (注意需要提前下载conf文件,或者将镜像中文件copy出来…

Long类型转换精度丢失问题解决

问题: 启动前端项目 页面传递的ID 和数据库保存的ID不一致 原因:给前端返回的id为long类型,在转换json传递到前端以后精度丢失,所以前端给我们的id也是丢失精度的id,不能查询数据。 因为js数字类型最大长度为16位,而java的long类…

Unity 0GC或者最大限度降低GC方案

文章目录 GC带来的问题性能瓶颈玩家体验受损 优化关键点1. **对象池技术**:2. **内存管理优化**:3. **UGUI优化**:4. **ECS架构下的优化**:5. **资源管理**:6. **自定义数据结构与算法**:7. **开启增量GC&a…

三菱plc学习入门(二,三菱plc指令,触点比较,计数器,交替,四则运算,转换数据类型)

今天,进行总结对plc的学习,下面是对plc基础的学习,希望对读者有帮助,欢迎点赞,评论,收藏!!! 目录 触点比较 当数据太大了的时候(LDD32位) CMP比…

贯穿设计模式-享元模式思考

写享元模式的时候,会想使用ConcurrentHashMap来保证并发,没有使用双重锁会不会有问题?但是在synchronize代码块里面需要尽量避免throw异常,希望有经验的同学能够给出解答? 1月6号补充:没有使用双重锁会有问…

lv14 ioctl、printk及多个此设备支持 6

1 ioctl操作实现 对相应设备做指定的控制操作(各种属性的设置获取等等) long xxx_ioctl (struct file *filp, unsigned int cmd, unsigned long arg); 功能:对相应设备做指定的控制操作(各种属性的设置获取等等) 参数…

ssm基于Java Web的怀旧唱片售卖系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装怀旧唱片售卖系统软件来发挥其高效地信息处理的作用&#x…

【STM32学习】硬件CRC与传统CRC-32计算的不同点

硬件CRC与传统CRC-32计算的不同点 1、stm32的硬件CRC32与传统CRC-32有何不同?2、解决办法 1、stm32的硬件CRC32与传统CRC-32有何不同? ①STM32F103的硬件CRC校验是对整个32位字进行CRC计算,传统的CRC-32是逐字节的计算。 ②STM32的硬件CRC32的…

C#,入门教程(09)——运算符的基础知识

上一篇: C#,入门教程(08)——基本数据类型及使用的基础知识https://blog.csdn.net/beijinghorn/article/details/123906998 一、算术运算符号 算术运算符号包括:四则运算 加 , 减-, 乘*, 除/与取模%。 // 加法,运算 int va 1 …

【JavaSE】Java中的反射动态代理

本篇文章整理的内容来源于: 反射原理 文章目录 一. 动态代理1. 优点2. 动态代理三要素3. 创建代理对象并使用 二. 反射1. 什么是反射2. 获取字节码文件对象的三种方式(1) Class.forName()获取 (源代码阶段)(2) 通过class属性获取(3) 通过对象获取字节码文件对象 3. 获取构造方…

LeetCode刷题11:滑动窗口解决1423.可获得的最大点数

几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 cardPoi…

网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】

网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】 https://www.bilibili.com/video/BV1Hp4y1o7RY/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605