当前位置: 首页 > news >正文

Spring事务粒度优化与传播机制

在Spring事务中,我们通常会为了控制事务粒度,会把它进行拆分,为了避免大事务执行太久,占用资源太多,导致资源利用率低的问题。

我们曾经就遇到老系统因为大事务,把服务打死了。

问题出在一个大事务中有一个Excel文件解析的操作,有用户上传的某个文件,有1百多万个空行数据。

因为,这个事务一致不能结束,直接导致系统崩溃。

但是要拆分事务,是一个麻烦的事情,要考虑事务传播机制。

无事务

我相信很多朋友都遇到过事务不生效的情况,最常见的就是下面这种情况:

public class ServiceA
{public void methodA(){methodB();}@Transactionalpublic void methodB(){}
}

我相信有朋友已经开始笑了。

不要笑,相信很多朋友本能会犯这个错误,因为这种方式最简单。

上面的示例,事务是不会生效的,因为methodB直接被调用,是因为没有通过代理执行。

问题很简单,但是如何快速简单的解决问题呢?

有事务不回滚

有对事务传播机制比较熟悉的朋友,可能要提出下面的方案了:

public class ServiceA
{@Transactional(propagation = Propagation.SUPPORTS)public void methodA(){methodB();}@Transactionalpublic void methodB(){}
}

既然,没有事务,我加上事务不加完了,SUPPORTS机制,没有事务就不创建,有事务就在事务中执行,
然后,methodB默认事务传播机制REQUIRED,没有就会创建事务。

所以,methodA没有事务,methodB直接创建事务执行,真是天才的想法啊。

问题是,实际情况真是这样吗?

比较遗憾,不是。

会有事务吗?会methodA会生成事务。

methodB会生成新的事务吗?不会,因为methodA已经有事务了。

会回滚吗?不会!有事务,但是不会回滚。

和不加@Transactional(propagation = Propagation.SUPPORTS)相比,只是会创建事务了。

为什么会出现这样的情况呢?

开的的时候,我以为是SUPPORTS没有回滚点的造成。

但是,我发现还是存在其他没有回滚点的事务传播机制,并且能够回滚

可以添加下面的代码打印看一下:

System.out.println(TransactionAspectSupport.currentTransactionStatus().hasSavepoint());

还有什么办法吗?

换个姿势调用

很多时候,我们没有得到正确的结果,可能是姿势不对,我们换个姿势试一试。

既然,直接调用不行,那我们通过ApplicationContext来调用,是否就可以触发事务了呢?

@Component
public class ApplicationContextHolder implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}public ApplicationContext getApplicationContext(){return this.applicationContext;}public <T> T  getService(Class<T> clazz){return applicationContext.getBean(clazz);}
}
public class ServiceA
{@Resourceprivate ApplicationContextHolder applicationContextHolder;public void methodA(){ServiceA service = applicationContextHolder.getService(this.getClass());service.methodB();}@Transactionalpublic void methodB(){}
}

答案是:不行,因为根本没有创建事务

多种姿势结合

public class ServiceA
{@Resourceprivate ApplicationContextHolder applicationContextHolder;@Transactional(propagation = Propagation.SUPPORTS)public void methodA(){ServiceA service = applicationContextHolder.getService(this.getClass());service.methodB();}@Transactionalpublic void methodB(){}
}

这样可以吗?

答案是:可以

事务是methodA的事务,并且也回滚了。

这的确解决了我们的问题,但是也违背了我们的初衷:将事务粒度变小。

因为,绕了一大圈,发现还是相当于methodA上的事务了。

那有没有什么更靠谱的解决方案呢?

大概可以试一试:NESTED和REQUIRES_NEW事务吧

public class ServiceA
{@Transactional(readOnly = true)public void methodA(){ServiceA service = applicationContextHolder.getService(this.getClass());service.methodB();}@Transactional(propagation = Propagation.NESTED)// @Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB(){}
}

可以回滚,但是:

  1. NESTED、REQUIRES_NEW都没有回滚点
  2. NESTED、REQUIRES_NEW都使用的是methodA的事务。

感觉和直接调用没有太多的区别

@Service
public class ServiceA
{@Resourceprivate ServiceB serviceB;public void methodA(){serviceB.methodB();}
}@Service
public class ServiceB
{    //    @Transactional(propagation = Propagation.NESTED)@Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB(){}
}

上面的方式,也可以回滚:

  1. 使用NESTED有回滚点,使用methodA的事务
  2. 使用REQUIRES_NEW,会创建新事务

事务传播机制

相关文章:

Spring事务粒度优化与传播机制

在Spring事务中&#xff0c;我们通常会为了控制事务粒度&#xff0c;会把它进行拆分&#xff0c;为了避免大事务执行太久&#xff0c;占用资源太多&#xff0c;导致资源利用率低的问题。 我们曾经就遇到老系统因为大事务&#xff0c;把服务打死了。 问题出在一个大事务中有一…...

MySQL 基于成本的优化

其实在MySQL中⼀条查询语句的执⾏成本是由下边这两个⽅⾯组成的&#xff1a; I/O成本 我们的表经常使⽤的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的&#xff0c;当我们想查询表中的记录时&#xff0c;需要先把数据或者索引加载到内存中 然后再操作。这个从磁盘…...

【maven】【IDEA】idea中使用maven编译项目,报错java: 错误: 找不到符号 【2】

idea中使用maven编译项目,报错java: 错误: 找不到符号 错误状况展示: 如果报这种错,是因为项目中真的找不到报错的方法或者枚举 字段之类的,但实际是 : 点击 File Path...

AIGC,ChatGPT AI绘画 Midjourney 注册流程详细步骤

AI 绘画,Midjourney完成高清图片绘制,轻松掌握AI工具。 前期准备: ① 一个能使用的谷歌账号 ② 可以访问外网 Midjourney注册 1.进入midjourney官网https://www.midjourney.com 点击左下角”Join the Beta”,就可以注册,第一次使用的小伙伴会弹出提示,只需要点击Acc…...

万字解析设计模式之模板方法与解释器模式

一、模板方法模式 1.1概述 定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 例如&#xff0c;去银行办理业务一般要经过以下4个流程&#xff1a;取号、排队、办理具体业…...

apipost接口200状态码,浏览器控制台500状态码

后端 url 登录login方法 login(){this.$refs.loginForm.validate(async valid > {if (!valid) return// 由于data属性是一个json对象&#xff0c;需要进行解构赋值{data:result}&#xff0c;进行状态码判断const {data: result} await this.$http.post(/api/doLogin,this.…...

Instant Web API .Net Core Crack

Instant Web API .Net Core 是立即构建即时数据库 Web API&#xff0c;无需编码。在几分钟内生成您的 Web API&#xff0c;以更快地构建应用程序。使用 VS 2022 和 Entity Framework Core 为任何 MS SQL 数据库生成 Web API。 新功能 - 使用 Visual Studio 2022 为 PostgreSQL …...

vue项目使用easyplayer播放m3u8直播推流

官网 青犀视频 代码库 / 示例 / demo EasyPlayer 示例效果&#xff1a; 项目背景如图 后端给了m3u8的直播地址 协议是 hls / flv 市面上很多第三方热门播放库都可以完成该多屏播放方式 如Video.js 问题在于 分多屏时 会存在性能问题 并且关闭播放器后 即便删除Dom或调用停…...

Python报错:AttributeError(类属性、实例属性)

Python报错&#xff1a;AttributeError&#xff08;类属性、实例属性&#xff09; Python报错&#xff1a;AttributeError 这个错误就是说python找不到对应的对象的属性&#xff0c;百度后才发现竟然是初始化类的时候函数名写错了 __init__应该有2条下划线&#xff0c;如果只有…...

vue+springboot读取git的markdown文件并展示

前言 最近&#xff0c;在研究一个如何将我们git项目的MARKDOWN文档获取到&#xff0c;并且可以展示到界面通过检索查到&#xff0c;于是经过几天的摸索&#xff0c;成功的研究了出来 本次前端vue使用的是Markdown-it Markdown-it 是一个用于解析和渲染 Markdown 标记语言的 …...

多功能PHP图床源码:Lsky Pro开源版v2.1 – 最新兰空图床

Lsky Pro是一款功能丰富的在线图片上传和管理工具&#xff0c;即兰空图床。它不仅可以作为个人云相册&#xff0c;还可以用作写作贴图库。 该程序的初始版本于2017年10月由ThinkPHP 5开发&#xff0c;经过多个版本的迭代&#xff0c;于2022年3月发布了全新的2.0版本。 Lsky Pro…...

Hive内置表生成函数

Hive内置UDTF 1、UDF、UDAF、UDTF简介2、Hive内置UDTF 1、UDF、UDAF、UDTF简介 在Hive中&#xff0c;所有的运算符和用户定义函数&#xff0c;包括用户定义的和内置的&#xff0c;统称为UDF&#xff08;User-Defined Functions&#xff09;。如下图所示&#xff1a; UDF官方文档…...

电源控制系统架构(PCSA)之电源控制框架概览

目录 6 电源控制框架 6.1 电源控制框架概述 6.1.1 电源控制框架低功耗接口 6.1.2 电源控制框架基础设施组件 6 电源控制框架 电源控制框架是标准基础设施组件、接口和相关方法的集合&#xff0c;可用于构建SoC电源管理所需的基础设施。 本章介绍框架的主要组件和低功耗接…...

Sentinel 监控数据持久化(mysql)

Sentinel 实时监控仅存储 5 分钟以内的数据&#xff0c;如果需要持久化&#xff0c;需要通过调用实时监控接口来定制&#xff0c;即自行扩展实现 MetricsRepository 接口&#xff08;修改 控制台源码&#xff09;。 本文通过使用Mysql持久化监控数据。 1.构建存储表&#xff08…...

基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码

基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于法医调查算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于法医调查优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…...

canvas高级动画001:文字瀑布流

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…...

抽象类, 接口, Object类 ---java

目录 一. 抽象类 1.1 抽象类概念 1.2 抽象类语法 1.3 抽象类特性 1.4 抽象类的作用 二. 接口 2.1 接口的概念 2.2 语法规则 2.3 接口的使用 2.4 接口间的继承 2.5 抽象类和接口的区别 三. Object类 3.1 toString() 方法 3.2 对象比较equals()方法 3.3 hash…...

SOAP 协议和 HTTP 协议:深入解读与对比

SOAP 和 HTTP 协议 SOAP 协议 SOAP&#xff08; Simple Object Access Protocol&#xff09;是一种用于在节点之间交换结构化数据的网络协议。它使用XML格式来传输消息。它在 HTML 和 SMTP 等应用层协议的基础上进行标记和传输。SOAP 允许进程在整个平台、语言和操作系统中进…...

Unity发布IOS后,使用xcode打包报错:MapFileParser.sh:Permissiondenied

1.错误提示 使用xcode打包错误提示&#xff1a;/Users/mymac/Desktop/myproject/MapFileParser.sh: Permission denied 2.解决方案 打开控制台输入&#xff1a;chmod ax /Users/mymac/Desktop/myproject/MapFileParser.sh。按回车键执行&#xff0c;然后重新使用xcode发布程序…...

2021年12月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下列程序,屏幕上可以看到几只小猫? A:1 B:3 C:4 D:0 答案:B 第2题 下列程序哪个可以实现:按下空格键,播放完音乐后说“你好!”2秒? A: B: C:...

DS4Windows完整指南:3步让PlayStation手柄在Windows电脑上完美运行

DS4Windows完整指南&#xff1a;3步让PlayStation手柄在Windows电脑上完美运行 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 想要在Windows电脑上使用PlayStation手柄畅玩所有游戏吗&am…...

如何让普通鼠标在macOS上获得超越触控板的体验:Mac Mouse Fix终极指南

如何让普通鼠标在macOS上获得超越触控板的体验&#xff1a;Mac Mouse Fix终极指南 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是否曾为ma…...

如何一键检测谁删除了你的微信好友:WechatRealFriends实战指南

如何一键检测谁删除了你的微信好友&#xff1a;WechatRealFriends实战指南 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFri…...

Python如何实现AutoCAD自动化?3个高效技巧快速掌握pyautocad

Python如何实现AutoCAD自动化&#xff1f;3个高效技巧快速掌握pyautocad 【免费下载链接】pyautocad AutoCAD Automation for Python ⛺ 项目地址: https://gitcode.com/gh_mirrors/py/pyautocad 想要用Python自动化AutoCAD操作吗&#xff1f;pyautocad库为您提供了完整…...

CPU运算速度的秘密武器:深入拆解超前进位加法器(Carry Look-ahead Adder)的设计思想

CPU运算速度的秘密武器&#xff1a;深入拆解超前进位加法器的设计思想 现代处理器对计算速度的追求从未停歇。当我们用手机流畅运行大型游戏&#xff0c;或是用工作站快速渲染3D模型时&#xff0c;背后都依赖于CPU每秒数十亿次的运算能力。而在这些运算中&#xff0c;加法操作占…...

Windows下ESP-IDF多版本环境高效管理实战

1. Windows下ESP-IDF多版本管理的必要性 如果你正在Windows平台上开发ESP32项目&#xff0c;很可能会遇到这样的场景&#xff1a;手头同时维护着基于不同ESP-IDF版本的项目&#xff0c;或者需要测试新版本特性但不敢贸然升级现有环境。这时候&#xff0c;多版本环境管理就成了刚…...

空洞骑士模组管理器Scarab终极指南:5分钟学会所有模组管理技巧

空洞骑士模组管理器Scarab终极指南&#xff1a;5分钟学会所有模组管理技巧 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的复杂流程而烦恼吗&#xf…...

ThreadPoolExecutor使用小问题

https://www.doubao.com/my-collection/43158096738596610?typeThread...

egergergeeert开源镜像扩展性:支持自定义LoRA与底座模型热替换方案

egergergeeert开源镜像扩展性&#xff1a;支持自定义LoRA与底座模型热替换方案 1. 镜像核心能力概述 egergergeeert是一套专为图像创作设计的文生图开源镜像&#xff0c;能够根据用户输入的提示词直接生成高质量图片。这套解决方案特别适合需要快速产出插画草图、角色设计、视…...

3个核心技巧:让DownKyi成为你的B站视频收藏专家

3个核心技巧&#xff1a;让DownKyi成为你的B站视频收藏专家 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;…...