求求你,别再乱用@Transactional了

求求你,别再乱用@Transactional了

文章目录

    • 🔊先看个问题
      • 📕情况1
        • 情况1结果
      • 🖥️情况2
        • 情况2结果
      • 📜 情况三
        • 情况3结果
      • 📘情况4
        • 情况4结果
    • 🔖先说结论
      • 情况1结果
      • 情况2结果
      • 情况3结果
      • 情况4结果
      • 📚7种传播行为
    • 🖊️最后总结

🔊先看个问题

你觉得test2方法执行后 user1表有几条数据?

📕情况1

image-20240108105311811

情况1结果

三条记录都保存成功了

image-20240108105636368

🖥️情况2

catch中throw出异常

image-20240108105751276

情况2结果

没有数据

image-20240108105859134

📜 情况三

去掉test2中的@transactional 与catch中的throw异常

image-20240108133805659

情况3结果

三条都保存了

image-20240108110509736

img

📘情况4

使用依赖注入方式调用all

image-20240108110616422

情况4结果

两条数据 id为3,4的出现异常 回滚了,其他正常保存

image-20240108110726046

铁子们,怎么样,此时你的表情是这样的

image-20240108111157423

还是这样的

img

是不是脑瓜子嗡嗡的😂,不要慌,这就给你们解密哈

🔖先说结论

情况1结果

只有一个事务,就是test2上的

image-20240108111726687

情况2结果

只有一个事务,就是test2上的,i=1的记录报错了,导致事务最终回滚,三条记录都不保存

image-20240108112023947

情况3结果

根本没有事务!!!!!

???为什么?why?what 发科??😳

img

-》因为all方法是this调用;为什么this调用就不会用到事务呢,不要慌,后面会详细解释的哈

image-20240108112204153

情况4结果

存在三个独立事务,都是all方法发起的,因为调用all方法是通过注入的方式调用,所以会产生事务

image-20240108112713559

兄弟们,脑壳不要打铁,忘掉刚刚的所有,无招胜有招,看一看下面的魔术揭秘,看完你就会评论区留言,小编这啥小儿科问题,太简单了,so easy,哈哈哈哈😄

img

1、首先讲解下spring中是怎么处理事务的

spring声明式事务是通过事务拦截器TransactionInterceptor拦截目标方法,来实现事务管理的功能的,事务管理器处理过程大致如下:

1、获取事务管理器
2、通过事务管理器开启事务
try{3、调用业务方法执行db操作4、提交事务
}catch(RuntimeException | Error){5、回滚事务
}

2、何时事务会回滚?

默认情况下,目标方法抛出RuntimeException或者Error的时候,事务会被回滚。

3、Spring事务管理器中的Connection和业务中操作db的Connection如何使用同一个的?

以DataSourceTransactionManager为事务管理器,操作db使用JdbcTemplate来说明一下。

创建DataSourceTransactionManager和JdbcTemplate的时候都需要指定dataSource,需要将他俩的dataSource指定为同一个对象。

当事务管理器开启事务的时候,会通过dataSource.getConnection()方法获取一个db连接connection,然后会将dataSource->connection丢到一个Map中,然后将map放到ThreadLocal中。

当JdbcTemplate执行sql的时候,以JdbcTemplate.dataSource去上面的ThreadLocal中查找,是否有可用的连接,如果有,就直接拿来用了,否则调用JdbcTemplate.dataSource.getConnection()方法获取一个连接来用。

所以spring中可以确保事务管理器中的Connection和JdbcTemplate中操作db的Connection是同一个,这样才能确保spring可以控制事务。

所以说,要想事务被回滚,必须让事务识别到异常,那个地方开启了事务,那个地方则需要识别到异常,没识别到则不会回滚,对比看下情况1和情况2,此时是不是比较清晰

image-20240108113802796

image-20240108113842695

img

再看情况3和情况4

因为spring声明式事务是通过事务拦截器TransactionInterceptor拦截目标方法,来实现事务管理的功能的所以通过this.all去调用的方法不会经过事务拦截器,也就没有事务啦

要想让事务生效,则必须通过注入的方式去调用❗️❗️❗️❗️❗️

此时再看下情况3,是不是了解了情况三为啥没事务啦

image-20240108114341872

image-20240108120418725

再看情况4,为啥他会开启三个事务呢

image-20240108114354448

那是因为Spring事务中一共有7种传播行为,默认的则是REQUIRED****

📚7种传播行为

Propagation是个枚举,有7种值,如下:

事务传播行为类型说明
REQUIRED如果当前事务管理器中没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择,是默认的传播行为。
SUPPORTS支持当前事务,如果当前事务管理器中没有事务,就以非事务方式执行。
MANDATORY使用当前的事务,如果当前事务管理器中没有事务,就抛出异常。
REQUIRES_NEW新建事务,如果当前事务管理器中存在事务,把当前事务挂起,然后会新建一个事务。
NOT_SUPPORTED以非事务方式执行操作,如果当前事务管理器中存在事务,就把当前事务挂起。
NEVER以非事务方式执行,如果当前事务管理器中存在事务,则抛出异常。
NESTED如果当前事务管理器中存在事务,则在嵌套事务内执行;如果当前事务管理器中没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

img

所以调用all的时候由于test2中没有事务,all则会自己新建一个事务啦,for循环了三次,则会新建三个事务呀,大家是不是都看明白了呢

看懂了建议给小编评论区来一波666,哈哈哈,比较码字不容易呀,你的支持就是小编连载的动力,求三连求三连求三连🥹(❁´◡❁)(❁´◡❁)

🖊️最后总结

🖲要熟练掌握技巧,一定多多坚持练习:骐骥一跃,不能十步;驽马十驾,功在不舍

搞笑点赞

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

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

相关文章

Linux查看物理CPU个数、核数、逻辑CPU个数

文章目录 总核数总逻辑CPU数查看物理CPU个数查看每个物理CPU中core的个数(即核数)查看逻辑CPU的个数 总核数 总核数 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep “…

探讨JS混淆技术及其加密解密实例

引言 在当前计算机科学领域中,保护软件代码的安全性和隐私性变得愈发重要。为了防止黑客攻击和恶意软件分析,开发人员采用各种技术来混淆和加密其代码,其中包括JS混淆技术。本文将介绍JS混淆技术的原理和应用,并提供一些相关的加密…

Tailscale 基础教程:Headscale 的部署方法和使用教程

Tailscale 是一种基于 WireGuard 的虚拟组网工具,它在用户态实现了 WireGuard 协议,相比于内核态 WireGuard 性能会有所损失,但在功能和易用性上下了很大功夫: 开箱即用 无需配置防火墙没有额外的配置 高安全性/私密性 自动密钥轮…

俏生元把握大健康行业发展趋势 构建居家悦己健康消费升级

健康与美丽是女性长久的必修课,近年来,消费者的养生需求不断增长。女性健康品牌俏生元把握大健康行业发展大趋势,聚力女性健康领域构建居家健康消费业态,做好女性健康管理顾问,让消费者从大健康跃进美好生活。 俏生元…

计算机毕业设计选题分享-SSM书籍借阅管理系统04770(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

SSM书籍借阅管理系统 摘 要 随着科学技术的告诉发展,我们已经步入数字化、网络化的时代。图书馆是学校的文献信息中心,是为全校教学和科学研究服务的学术性机构,是学校信息化的重要基地。图书馆的工作是学校和科学研究工作的重要组成部分&…

statsmodels.tsa 笔记 detrend(去趋势)

1 基本使用方法 statsmodels.tsa.tsatools.detrend(x, order1, axis0) 2 参数说明 x数据。如果是二维数组,那么每一行或每一列将独立地去除趋势,但趋势的阶数是一样的。order趋势的多项式阶数。0 表示常数趋势(即没有趋势)&…

Java学习笔记-day02-在IDEA中使用git忽略提交.idea下的文件

1.在根目录.gitignore文件排除.idea目录 ### IntelliJ IDEA ### .idea2.使用重置Head还原已经add过的文件 创建项目时,可能会有.idea中的文件先add到git后再创建的.gitignore文件,导致文件commit时无法排除,如下所示。 使用重置Head将文件…

redhat+ oracle 11.2.0.4 RAC 搭建 dataguard

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! redhat oracle 11.2.0.4 RAC 搭建 dataguard 1.安装环境 主机名 OS DB SID db_name db_unique_name rac1 Redhat7 11.2.0.4 orcl1 orcl o…

Android性能优化系列——APK包优化

业务功能开发完之后,就需要对App打包了。 有时候明明功能不多,但是包体很大,一是影响上架,二是就几个功能但是很大心里会膈应,于是包体有时候也需要进行优化。同类型的竞品只要40m,你要200M,那我肯定愿意先…

跨国文件传输网络丢包的四大原因和修复方式

在全球化的影响下,跨国传输在企业和个人的日常工作中发挥着越来越重要的作用。然而,由于各种原因,网络丢包问题时有发生。本文将详细分析跨国文件传输网络丢包的四大原因,并介绍相应的修复方式。 一、跨国文件传输网络丢包的四大原…

服务器组网方案

在当今数字化时代,服务器组网方案不仅是企业信息管理的关键,更是支撑业务运作的核心架构 。为了实现高效的数据处理和存储,服务器组网方案成为企业不可或缺的一部分。本文将深入探 讨服务器组网方案的核心要素和实施策略,明确其在…

安卓Android Studioy读写NXP ICODE2 15693标签源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.4391789eCLwm3t&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xm…