spring中事务失效的情况(常见的5种)

news2024/12/28 11:20:27

1.多线程调用

从上面的例子中,我们可以看到事务方法add中,调用了事务方法doOtherThing,但是事务方法doOtherThing是在另外一个线程中调用的。

这样会导致两个方法不在同一个线程中,获取到的数据库连接不一样,从而是两个不同的事务。如果想doOtherThing方法中抛了异常,add方法也回滚是不可能的。

如果看过spring事务源码的朋友,可能会知道spring的事务是通过数据库连接来实现的。当前线程中保存了一个map,key是数据源,value是数据库连接。

我们说的同一个事务,其实是指同一个数据库连接,只有拥有同一个数据库连接才能同时提交和回滚。如果在不同的线程,拿到的数据库连接肯定是不一样的,所以是不同的事务。

2.方法内部调用

有时候我们需要在某个Service类的某个方法中,调用另外一个事务方法,比如:

我们看到在事务方法add中,直接调用事务方法updateStatus。从前面介绍的内容可以知道,updateStatus方法拥有事务的能力是因为spring aop生成代理了对象,但是这种方法直接调用了this对象的方法,所以updateStatus方法不会生成事务。

 方法内部调用的解决办法

在该Service类中注入自己

3.访问权限问题 

java的访问权限主要有四种:private、default、protected、public,它们的权限从左到右,依次变大。

但如果我们在开发过程中,把有某些事务方法,定义了错误的访问权限,就会导致事务功能出问题,例如:

我们可以看到add方法的访问权限被定义成了private,这样会导致事务失效,spring要求被代理方法必须是public的。

说白了,在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。

也就是说,如果我们自定义的事务方法(即目标方法),它的访问权限不是public,而是private、default或protected的话,spring则不会提供事务功能。

4.方法被final修饰 

有时候,某个方法不想被子类重新,这时可以将该方法定义成final的。普通方法这样定义是没问题的,但如果将事务方法定义成final,例如:

我们可以看到add方法被定义成了final的,这样会导致事务失效。

为什么?

如果你看过spring事务的源码,可能会知道spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。

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

注意:如果某个方法是static的,同样无法通过动态代理,变成事务方法。

 5.未被spring管理

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

通常情况下,我们通过@Controller、@Service、@Component、@Repository等注解,可以自动实现bean实例化和依赖注入的功能。

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

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

相关文章

centos7宝塔项目配置步骤

0、 1、 2、前面两个空格去掉勾 3、window 配置虚拟机 对应的域名

Django高级扩展之celery使用

Celery是一个简单、灵活、可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。是一个专注于实时处理的任务队列,同时还支持任务调度。 目录 应用场景 问题 解决 celery架构图 安装 配置celery Settings.py配置…

CVE-2022-25099

文章目录 CVE-2022-25099一、漏洞介绍二、渗透步骤1、打开网站2、登录后台3、文件上传4、查看flag值 CVE-2022-25099 一、漏洞介绍 WBCE CMS v1.5.2 RCE。 WBCE CMS v1.5.2 /language/install.php 文件存在漏洞,攻击者可精心构造文件上传造成RCE。 二、渗透步骤 1…

宝塔面板实用教程(1):10分钟部署在线客服系统

客服系统发布以来,一直有朋友询问如何在宝塔面板中安装部署,开始我一直认为参考 Linux 版的安装教程就可以了,一直没有专门写宝塔环境的教程。这段时间来咨询的朋友越来越多,经过了解,我才知道宝塔面板的普及率有多高&…

SSM流浪动物救助网站-计算机毕设 附源码82131

SSM流浪动物救助网站 摘 要 随着生活水平的持续提高和家庭规模的缩小,宠物已经成为越来越多都市人生活的一部分,随着宠物的增多,流浪的动物的日益增多,中国的流浪动物领养和救助也随之形成规模,同时展现巨大潜力。本次…

XML文件

xml文件 类似于html那种标签语言 但是用途却大不一样,xml一般用于小型数据传输(存储数据) xml文件作用 xml语法规则 一个简单的xml文件案例 xml解析 解析思想 所谓的xml解析 也就是从xml文件提取数据 解析思想:前端的文档对…

【C++实现】RPC框架的简单实现介绍

文章目录 介绍为什么使用protobufprotobuf的service rpc 框架发布方的上层使用逻辑框架的提供方逻辑Rpc调用方框架实现客户端上层框架使用重新梳理简单聊一下RpcController 引入缓冲区队列zookeeper总结 介绍 以下博客覆盖内容: 集群和分布式概念原理; …

安科瑞智能照明系统在绿色建筑中的应用与产品选型

【摘要】:智能照明系统应用在智能建筑中不仅能营造出舒适的生活、工作环境以及现代化的管理方式而且要具有一定的节能效果。给出了智能照明和传统照明系统的比较并分析了智能照明系统的节能。 【关键字】:智能建筑;智能照明;节能…

什么样的口译是好的?交传和同传的评估标准是什么?

众所周知,交传和同传是口译的两种高级形式,难度比较大,一般应用于国际会议、商务洽谈、重大新闻发布会等领域。那么,如何做好交传和同传翻译,什么样的口译是好的,交传和同传的评估标准是什么,北…

密码学obe软件思路

匿名通信与暗网研究综述 匿名通信系统是一种建立在Internet之上综合利用数据转发、内容加密、流量混淆等多种技术隐藏通信实体关系和内容的覆盖网络.由于匿名通信主体难以被追踪定位,匿名通信网络中各类匿名滥用问题层出不穷,而其中隐藏服务机制更是被用于构建充斥着各种非法…

Integer移位算法

常用移位算法 给定值最高位1的权重给定值最低位1的权重给定值高位连续零的个数给定值低位连续零个数 给定值最高位1的权重 也就是给定值左侧。返回给定值左侧最大的2的次幂 //获取i最高位1代表的2次幂,最高位1代表的权值public static int highestOneBit(int i) …

轻量化技术 | 大面积模型秒加载、TB级数据处理能力、多平台便捷展示应用...

实景三维技术的发展日新月异,但在应用上却一直无法深入,尤其是在大场景三维模型展示与应用过程中,不可避免地会遇到占内存、渲染慢、加载卡顿、模型塌陷等情况,这是由于数据格式类型多、内存占比大、模型体量大。 对此&#xff0…

C++ STL关联式容器和无序容器(哈希容器)

文章目录 5.2 C STL关联式容器5.2.1 C STL map容器5.2.2 C STL multimap容器5.2.3 C STL set容器5.2.2 C STL multiset容器 5.3 C STL无序容器(哈希容器) 参考 5.2 C STL关联式容器 关联式容器在存储元素值的同时,会为各元素额外再配备一个值…

让你不再疑惑PDF转Excel怎么操作

你是否曾经遇到过需要编辑PDF表格的情况,但却不知道如何进行转换?不用担心,现在有一些简单的方法可以将PDF表格转换为Excel,让你轻松地编辑和修改表格。如果你还不知道PDF表格转Excel怎么转的话,那么接下来三种实用的小…

摆脱传统模式,快速构建系统只需要7步~

摆脱传统模式,快速构建系统只需要7步~ 首先我们来说说用“低代码开发平台”来进行开发是一种怎样的感受?它可以帮助您更快、更可靠地提供价值。通过在可视化设计器中,以拖拽的方式快速构建应用程序,您可以跳过基础架构以及可能会让…

聚观早报 | TikTok首席运营官离职;AMDR7 7840HS轻薄本开始上市

今日要闻:TikTok首席运营官离职;AMDR7 7840HS轻薄本开始上市;美国5月AI招聘岗位增加约20%;荷兰传最收紧ASML对华出口限制;力斯SERES5完成欧洲首批交付 TikTok首席运营官离职 当地时间 6 月 22 日,TikTok 首…

LangChain 基于 Prompts 提示管理 构建特定领域模型

一、langChain Prompts 上篇文章对 langChain 进行了简单的介绍与使用,可以知道LangChain 是一个由语言模型LLMs驱动的应用程序框架,使用 LangChain 可以极大的降低开发成本,本篇文章主要基于 LangChain 中的 Prompts 提示管理实现特定领域的…

【软件设计师暴击考点】知识产权高频考点暴击系列

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…

Linux conda 环境迁移 服务器之间在线迁移

网上很多方法语焉不详,本文章主要介绍conda list方式进行Linux系统在线环境迁移,迁移完毕后需要手动安装缺失的python库,负责环境不推荐此种方式迁移。 在Linux系统之间进行单一环境迁移:从服务器A迁移到服务器B 服务器A&#xf…

磷酸铁锂电池应用前景广阔,英集芯响应市场推出IP2366电源管理芯片

正极材料是锂电池的核心材料之一,其性能直接影响锂电池的能量密度、安全性、寿命和应用等,占电池总材料成本中的比例超过30%。目前行业内常见的锂离子电池正极材料主要可分为磷酸铁锂(LFP)、三元材料(NCM、NCA&#xf…