Spring事务的失效场景
事务失效场景
-
方法用private或final修饰
Spring底层使用了AOP,而AOP的实现方式有两种,分别是JDK动态代理和CGLIB,JDK动态代理是实现抽象接口,CGLIB是继承父类,无论哪种方式,都需要重写方法来进行方法增强,而用private或final修饰的方法都是不能被重写的 -
方法自调用(如何解决方法自调用导致的事务失效)
UserService类中开启A方法调用B方法,直接调用A方法会导致B方法的Transactional注解不生效,从而导致事务失效
@Component
public class UserService{@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void A() {//this.B()和B()同理B();}@Transactional(propagation = Propagation.NEVER)public void B(){jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}
}
为什么事务会失效?Spring生成的代理类大致如下,调用A方法会执行$Proxy0.A(),而B方法是被代理对象target调用的,所以方法不会被增强
public class $Proxy0 extends UserService {private UserService target;public void A() {//建立数据库连接ConnectionConnection connection = DriverManager.getConnection("jdbc:mysql:///user");connection.setAutoCommit(false);try{target.A();}catch(RuntimeException exception){connection.rollback();return;}connection.commit();}
}
- 多线程调用
执行SQL时会从ThreadLocal里获取数据库连接对象,而ThreadLocal是线程隔离的,新线程无法从主线程的ThreadLocal里获取数据库连接对象,所以只能新建一个数据库连接来执行SQL,此时autoCommit默认是true,执行完SQL就会自动提交,抛出异常也就不能回滚了
@Component
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void B() {new Thread(() -> {jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}).start();}
}
-
类没有被Spring管理
-
数据库不支持事务
-
异常被手动try-catch掉了
如何解决方法自调用导致的事务失效
- 自己注入自己
@Component
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Autowiredprivate UserService userService;public void A() {//从Spring容器中取出代理对象userService.B();}@Transactionalpublic void B() {jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}
}
- 把被调用的方法拆分到别的Bean中,然后再把这个Bean注入进来
- AopContext.currentProxy() + @EnableAspectJAutoProxy(exposeProxy = true)
@Component
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;public void A() {UserService userService = (UserService) AopContext.currentProxy();userService.B();}@Transactionalpublic void B() {jdbcTemplate.execute("insert into user values(1, 1, '1')");throw new NullPointerException();}
}
相关文章:
Spring事务的失效场景
事务失效场景 方法用private或final修饰 Spring底层使用了AOP,而AOP的实现方式有两种,分别是JDK动态代理和CGLIB,JDK动态代理是实现抽象接口,CGLIB是继承父类,无论哪种方式,都需要重写方法来进行方法增强,而…...
芯动联科在科创板IPO过会:拟募资10亿元,金晓冬为实际控制人
2月13日,上海证券交易所披露的信息显示,安徽芯动联科微系统股份有限公司(下称“芯动联科”)获得科创板上市委会议审议通过。据贝多财经了解,芯动联科于2022年6月24日在科创板递交招股书。 本次冲刺上市,芯…...
数据结构之单链表
一、链表的组成 链表是由一个一个的节点组成的,节点又是一个一个的对象, 相邻的节点之间产生联系,形成一条链表。 例子:假如现在有两个人,A和B,A保存了B的联系方式,这俩人之间就有了联系。 A和…...
儿子跟妈妈关系不好怎么办?这里有解决办法!
15岁的男孩子正处于青春期,很多男孩都傲慢自大,听不进去别人的建议,以自己为中心,认为自己能处理好自己的事情,不想听父母的唠叨。母亲面对青春期的孩子也是举手无措,语气不好,会让孩子更叛逆。…...
论文投稿指南——中文核心期刊推荐(植物保护)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
华科万维C++章节练习4_6
【程序设计】 题目: 编程输出下列图形,中间一行英文字母由输入得到。 A B B B C C C C C D D D D D D D C C C C C B B B A 开头空一格,字母间空两格…...
详解子网技术
一 : Internet地址 Intemet实质上是把分布在世界各地的各种网络如计算机局域网和广域网、数字数据通信网以及公用电话交换网等互相连接起来而形成的超级网络。但是 , 网络的物理地址给Internet统一全网地址带来两个方面的问题: 第一,物理地址是物理网络技术的一种…...
chatGTP的全称Chat Generative Pre-trained Transformer
chatGPT,有时候我会拼写为:chatGTP,所以知道这个GTP的全称是很有用的。 ChatGPT全名:Chat Generative Pre-trained Transformer ,中文翻译是:聊天生成预训练变压器,所以是GPT,G是生…...
hive数据存储格式
1、Hive存储数据的格式如下: 存储数据格式存储形式TEXTFILE行式存储SEQUENCEFILE行式存储ORC列式存储PARQUET列式存储 2、行式存储和列式存储 解释: 1、上图左面为逻辑表;右面第一个为行式存储,第二个温列式存储; …...
mysql数据库备份与恢复
mysql数据备份: 数据备份方式 物理备份: 冷备:.冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库热备:一般用于保证服务正常不间断运行,用两台机器作为服务机器,一台用于实际数据库操作应用,另外…...
《NFL橄榄球》:辛辛那提猛虎·橄榄1号位
辛辛那提猛虎(英语:Cincinnati Bengals),又译辛辛那提孟加拉虎,是一支职业美式橄榄球球队位于俄亥俄州辛辛那提。他们现时为美联北区的其中一支球队,他们在1968年加入美国橄榄球联合会,并在1970…...
2、线程、块和网格
目录一、线程、块、网格概念二、代码分析2.1 打印第一个线程块的第一线程2.2 打印当前线程块的当前线程2.3 获取当前是第几个线程一、线程、块、网格概念 CUDA的软件架构由网格(Grid)、线程块(Block)和线程(Thread&am…...
C++ 算法主题系列之贪心算法的贪心之术
1. 前言 贪心算法是一种常见算法。是以人性之念的算法,面对众多选择时,总是趋利而行。 因贪心算法以眼前利益为先,故总能保证当前的选择是最好的,但无法时时保证最终的选择是最好的。当然,在局部利益最大化的同时&am…...
请注意,PDF正在传播恶意软件
据Bleeping Computer消息,安全研究人员发现了一种新型的恶意软件传播活动,攻击者通过使用PDF附件夹带恶意的Word文档,从而使用户感染恶意软件。 类似的恶意软件传播方式在以往可不多见。在大多数人的印象中,电子邮件是夹带加载了恶…...
【Kubernetes】【二】环境搭建 环境初始化
本章节主要介绍如何搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类:一主多从和多主多从。 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境多主…...
Python:每日一题之发现环(DFS)
题目描述 小明的实验室有 N 台电脑,编号 1⋯N。原本这 N 台电脑之间有 N−1 条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时,管理员误操作使得某两台电脑之间…...
C++设计模式(14)——享元模式
亦称: 缓存、Cache、Flyweight 意图 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。 问题 假如你希望在长时间工作后放…...
SpringCloud之Eureka客户端服务启动报Cannot execute request on any known server解决
项目场景: 在练习SpringCloud时,Eureka客户端(client)出现报错:Cannot execute request on any known server 问题描述 正常启动SpringCloud的Server端和Client端,结果发现Server端的控制台有个Error提示,如下&#…...
从零开始搭建kubernetes集群环境(虚拟机/kubeadm方式)
文章目录1 Kubernetes简介(k8s)2 安装实战2.1 主机安装并初始化2.2 安装docker2.3 安装Kubernetes组件2.4 准备集群镜像2.5 集群初始化2.6 安装flannel网络插件3 部署nginx 测试3.1 创建一个nginx服务3.2 暴漏端口3.3 查看服务3.4 测试服务1 Kubernetes简…...
【零基础入门前端系列】—表格(五)
【零基础入门前端系列】—表格(五) 一、表格 表格在数据展示方面非常简单,并且表现优秀,通过与CSS的结合,可以让数据变得更加美观和整齐。 单元格的特点:同行等高、同列等宽。 表格的基本语法࿱…...
专业解决方案:DirectInput转XInput兼容工具让老旧游戏手柄重获新生
专业解决方案:DirectInput转XInput兼容工具让老旧游戏手柄重获新生 【免费下载链接】XOutput DirectInput to XInput wrapper 项目地址: https://gitcode.com/gh_mirrors/xo/XOutput 对于游戏爱好者和模拟器玩家来说,老旧游戏手柄无法兼容现代游戏…...
5分钟彻底告别乱码!GBKtoUTF-8编码转换终极指南
5分钟彻底告别乱码!GBKtoUTF-8编码转换终极指南 【免费下载链接】GBKtoUTF-8 To transcode text files from GBK to UTF-8 项目地址: https://gitcode.com/gh_mirrors/gb/GBKtoUTF-8 还在为Windows和Mac之间文件传输乱码而烦恼吗?GBKtoUTF-8编码转…...
G-Helper终极指南:如何用这款轻量级工具彻底释放你的华硕笔记本潜能
G-Helper终极指南:如何用这款轻量级工具彻底释放你的华硕笔记本潜能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook…...
AlwaysOnTop:三分钟掌握Windows窗口置顶技巧,工作效率提升85%
AlwaysOnTop:三分钟掌握Windows窗口置顶技巧,工作效率提升85% 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否经常在多个应用程序间频繁切换&#…...
Copy4AI:VSCode扩展,智能复制代码结构助力AI编程助手
1. 项目概述:一个为AI对话而生的代码复制工具如果你经常和ChatGPT、Claude这类大语言模型打交道,尤其是需要它们帮你分析、调试或重构代码时,你肯定遇到过这个痛点:怎么把项目里一堆相关的文件内容,连同它们的目录结构…...
OpenClaw视觉化文档生成器:一键将技术描述转为交互图表
1. 项目概述:为OpenClaw打造的视觉化文档生成器 如果你和我一样,经常需要向团队解释一个复杂的系统架构,或者向客户展示一份代码变更的评审报告,你肯定也厌倦了在聊天窗口里贴大段大段的文字描述,或者用简陋的ASCII字…...
Modbus转IEC61850网关在能源电站的应用
某工厂能源电站部署有多台电力仪和温控仪,要求将电力仪表中的线电压、电流数据、有功功率以及温控仪的温度数据,实时传输至电力管理系统中,从而实现上位机系统对现场设备的监控、管理与数据统计分析。经过调研,现场电表仪表与温控…...
基于MCP协议构建AI编程对话本地搜索引擎:cursor-history-mcp实战
1. 项目概述:为你的AI对话记忆安一个“外置大脑”如果你和我一样,深度依赖 Cursor 这类 AI 编程助手,那你一定有过这样的时刻:上周和 Claude 讨论的那个精妙的数据库优化方案,具体是怎么实现的来着?上个月为…...
终极跨平台工具:无需Steam客户端,5分钟掌握WorkshopDL创意工坊下载秘籍
终极跨平台工具:无需Steam客户端,5分钟掌握WorkshopDL创意工坊下载秘籍 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否曾经为无法访问Steam创意工…...
Arm Mali-G510纹理单元优化与性能分析
1. Arm Mali-G510纹理单元深度解析Mali-G510的纹理单元采用分层次设计架构,包含纹理拾取(Texture Fetch)、过滤(Filtering)和缓存(Cache)三个主要模块。纹理拾取模块负责解析纹理坐标和生成采样…...
