Spring事务在什么情况下会失效?

news/2024/4/26 14:45:55/文章来源:https://blog.csdn.net/qq_46130027/article/details/130330658

Spring事务在什么情况下会失效?

  • 访问权限问题
  • 方法用final修饰
  • 对象没有被Spring管理
  • 表不支持事务
  • 方法内部调用
    • 三种处理方法
  • 未开启事务
  • 吞了异常
  • 其他

访问权限问题

java的访问权限主要有四种:

  1. private
  2. default
  3. protected
  4. public

如果事务方法的访问权限不是定义成public,这样会导致事务失效。

因为spring要求被代理方法必须是public的。

翻开源码,可以看到,在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则返回null,即不支持事务。

方法用final修饰

如果事务方法用final修饰,将会导致事务失效。

因为spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。

但如果某个方法用final修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能。

对象没有被Spring管理

使用spring事务的前提是:对象要被spring管理,需要创建bean实例。

如果类没有加@Controller、@Service、@Repository等注解,即该类没有交给spring去管理,那么它的方法也不会生成事务。

表不支持事务

如果MySQL使用的存储引擎是myisam,这样的话是不支持事务的。因为myisam存储引擎不支持事务。

方法内部调用

update方法上没有加@Transactional注解,调用有@Transactional注解的updateOrder方法,updateOrder方法上的事务会失效。

因为发生了自身调用,调用该类自己的方法,而没有经过Spring的代理类,只有在外部调用事务才会生效。

三种处理方法

  1. 再声明一个service,将内部调用改为外部调用。
  2. 使用编程式事务。
  3. 使用AopContext.currentProxy()获取代理对象。

未开启事务

如果是spring项目,则需要在配置文件中手动配置事务相关参数。如果忘了配置,事务肯定是不会生效的。

如果是springbootI项目,那么不需要手动配置。因为springboot已经在DataSourceTransactionManage rAutoConfiguration类中帮我们开启了事务。

吞了异常

有时候事务不会回滚,有可能是在代码中手动catch了异常。

因为开发者自己捕获了异常,又没有手动抛出,把异常吞掉了,这种情况下spring事务不会回滚。

如果想要spring事务能够正常回滚,必须抛出它能够处理的异常。

如果没有抛异常,则spring认为程序是正常的。

其他

  1. 错误的事物传播特性也会导致事务不起作用,例如never和not_supported。
  2. 同一类中互相调用也是会失效的。
  3. 多线程,也会导致事务失效。

参考资料:Spring事务在什么情况下会失效?

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

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

相关文章

商品价格监控业务场景,API数据分析

商品价格监控指的是对特定商品价格进行实时监控和跟踪,及时更新最新价格并分析价格变化的行为。这种监控可以帮助企业及时了解市场行情,并根据价格变化情况做出相应的调整,以更好地应对市场变化。 一般来说,商品价格监控需要以下…

KVM虚拟机的磁盘无损扩容方法-qcow2格式的

起因:我的KVM主机上安装了基于Debian11的 虚拟机母鸡,其他虚拟机都由此克隆而来。因为最初只配置了8G的虚拟硬盘,因此在需要占用比较大的空间的应用时,就比较麻烦。度娘等中文搜索结果没找到答案,只能google了。 这里…

JavaScript概述四(DOM文档对象模型)

1.DOM(Document Object Model) 会把网页里面的元素当成对象去操作,包含对象的属性,属性值,方便我们去 操作网页。 整个页面最终会形成一个对象 :document ,页面里面的所有的元素(如 标签 ) 最终都会转换成 js 里面的对象。 1.1 获取页面的元素(通过选择器&#xff0…

JS-11A/224时间继电器 JOSEF约瑟 板前、板后接线

系列型号: JS-11A/11集成电路时间继电器;JS-11A/12集成电路时间继电器; JS-11A/13集成电路时间继电器;JS-11A/136集成电路时间继电器; JS-11A/137集成电路时间继电器;JS-11A/22集成电路时间继电器&#…

数据结构与算法(三):数论(树形结构、二叉树、二叉搜索树、红黑树、Btree、B+Tree、赫夫曼树、堆树)

数论(树形结构、二叉树、二叉搜索树、红黑树、Btree、BTree、赫夫曼树、堆树) 树形结构概念 在树形结构里面重要的术语: 结点:树里面的元素。 父子关系:结点之间相连的边 子树:当结点大于1时&#xff0…

华为OD机试真题(Java),数字涂色(100%通过+复盘思路)

一、题目描述 疫情过后,希望小学终于又重新开学了,三年二班开学第一天的任务是将后面的黑板报重新制作。 黑板上已经写上了N个正整数,同学们需要给这每个数分别上一种颜色。 为了让黑板报既美观又有学习意义,老师要求同种颜色的…

LoadRunner参数化最佳实践:让你的性能测试更加出色!

距离上次使用loadrunnr 已经有一年多的时间了。初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作。这算…

QMS-云质说质量 - 1 张小泉的质量危机

云质QMS原创 转载请注明来源 作者:王洪石 引言 百年老店的拍蒜质量门 最近张小泉拍蒜断刀事件,吸引了全民关注,虽然随后发布了“断刀召集令”,但从事件发生到后续拖沓且不专业的应对,张小泉肯定是“失蒜”了。 张小泉…

Spring Security实战(六)—— 跨域与CORS

跨域是一种浏览器同源安全策略,即浏览器单方面限制脚本的跨域访问。 一、认识跨域 跨域(Cross-Origin)指的是在Web开发中,当一个网页的内容要从不同源(即不同的域名、协议或端口)获取时,就会发…

ajax的介绍及使用

ajax的介绍 开发流程 前端 ajax:前后端沟通的桥梁 后端 ajax介绍 ajax叫做异步的Javascript和xml ajax通过浏览器与服务器(后端)进行少量数据交互,进行页面异步更新(网页不会重新加载) 优点: 减轻服务器负…

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页---前后端分离)、axios加载失败)

Vue3进阶使用详解(node.js、Vue3路由基础项目、axios的使用详细(实现数据分页—前后端分离)、axios加载失败) Vue cli CLI是Commond-Line Interface,翻译为命令界面,又称脚手架。VueCLI是一个官方发布vue.js项目脚手架。使用VueCLI可以快速搭建vue开发…

v-for比v-if优先级更高?面试官:回去等通知吧

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 v-if和v-for哪个优先级更高呢?这是面试官常常问到的一个问题,…

算法训练 Day41 | 动态规划

343. 整数拆分 思路: 确定dp数组(dp table)以及下标的含义:dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。 确定递推公式:dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

3.Spring Security实现JWT token验证

目录 1. Spring Security详细介绍 2. Spring Security详细使用 3. Spring Security实现JWT token验证 4. JWT(JSON Web Token,JSON令牌) 5. Spring Security安全注解 Spring Security实现JWT token验证 Spring Security是Spring提供的一…

【Spring篇】DI相关内容

🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、setter注入 1.环境准备 2.注入引用数据类型 3.注入简单数据类型 二、构造器注入 1.环境准备 2.构造器注入引用数据类型 3.构造器注入多个引用数据类型 4.构造器注入多个简单数据类型 …

SAS学习第4章:t检验

前话:分析试验数据的差异,一般都会假设样本值之间或者样本与标准值之间无差异,根据不同方法计算得出的t值、q值、F值等等,均表示两者之间的差异程度,值越大,两者差异越大,该假设越不成立&#x…

Vue3+Three.js+antvG2实战项目 智慧城市(三)

前言 在网上找了很久都没有找到使用Three.js开发智慧城市的免费文章或者免费视频,自己花了一点时间做了一个纯前端的智慧城市项目。 技术栈都是最新的:vue3vitetypeScriptThreeantv G2 源码分享 源码 模型,天空图盒子链接分享(不想下载源码可以只用下这个)提取码1234 20230424_…

TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

https://www.usenix.org/conference/osdi18/presentation/chen 文章目录 TVM: An Automated End-to-End Optimizing Compiler for Deep Learning引言1. 简介2. 总览3. 优化计算图4. 生成张量运算4.1 张量表达式和调度空间4.3 嵌套并行与协作4.3 张量化4.4 显式内存延迟隐藏 5 .…

跌倒检测和识别4:C++实现跌倒检测(含源码,可实时跌倒检测)

跌倒检测和识别4:C实现跌倒检测(含源码,可实时跌倒检测) 目录 跌倒检测和识别4:C实现跌倒检测(含源码,可实时跌倒检测) 1. 前言 2. 跌倒检测模型(YOLOv5) (1)跌倒检测模型训练 …

2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

4月22日,2023首届云数据库技术沙龙 MySQL x ClickHouse 专场,在杭州市海智中心成功举办。本次沙龙由玖章算术、菜根发展、良仓太炎共创联合主办。围绕“技术进化,让数据更智能”为主题,汇聚字节跳动、阿里云、玖章算术、华为云、腾…