Springboot @Transactional大事务处理的几点建议

1.大事务:

总体任务对应的事务运行时间比较长,长时间未提交的事务。

2.大事务的危害:

a.并发情况下,数据库连接池资源占满。大事务提交不及时,导致连接资源释放缓慢。
b.数据库死锁和锁等待。mysql innodb存储引擎背景下,事务如果占用了排他锁,会容易导致并发情况下数据死锁或者锁等待。
c.大事务Rt时间长,容易导致接口超时。
d.大事务回滚时间长。
e.数据库主从架构下,数据同步延迟

3.解决办法

3.1 将声明式事务的@Transactional方式 合理的替换为 编程式事务TransactionTemplate 的方式
声明式事务的粒度最小是整个方法,可能会导致业务里不必要的逻辑都加了事务。编程式事务细化需要加事务的逻辑上,形成实际有用的事务块。

@Autowired
private TransactionTemplate transactionTemplate;public void testTransaction() {transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {try {// ....  业务代码} catch (Exception e){//回滚transactionStatus.setRollbackOnly();}}});
}

3.2 将查询放在事务方法外
使用@Transactional 又想避免产生大事务,需对方法进行拆分,将不需要事务管理的逻辑与事务操作分开

@Service
public class TransactionTestService{// 避免同一个类内部方法相互调用,实例方法调用代理方法而导致事务失效@Resourceprivate TransactionTestService service;public void create(ParamDto dto){queryData1();queryData2();service.save(dto);}//事务操作@Transactional(rollbackFor = Exception.class)public void save(ParamDto dto){paramDao.insert(dto);}
}

3.3 避免跨服务间的远程调用
服务间的通讯及服务之间的调用时间 受网络环境和远端接口Rt时间的影响,可能会比较耗时。

反例://事务操作@Transactional(rollbackFor = Exception.class)public void save(ParamDto dto){// 调用了其他服务otherRemoteApi();paramDao.insert(dto);}修改为:@Autowiredprivate TransactionTemplate transactionTemplate;public void save(ParamDto dto){// 调用了其他服务otherRemoteApi();transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {try {paramDao.insert(dto);} catch (Exception e){//回滚transactionStatus.setRollbackOnly();}}});}

3.4 事务中不应该一次性处理太多的数据,可以使用分批执行
3.5事务中的方法可以根据业务使用异步执行

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

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

相关文章

JS 事件捕获、事件冒泡、事件委托

js事件机制在开发中可以说时刻使用,例如dom绑定事件、监听其自身事件等。js事件机制有事件捕获、事件冒泡俩种机制,我们分别说下这俩种机制的使用场景。 一、概念 事件捕获顺序如下: window > document > body > div 事件冒泡顺序…

Using WebView from more than one process

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题过程源码追踪…

【C++进阶】C++继承概念详解

C继承详解 一,继承的概念和定义1.1 继承的概念1.2 继承的定义1.3 继承关系和访问限定符 二,基类和派生类的对象赋值转移三,继承的作用域四,派生类的默认成员函数五,继承和友元&静态成员和继承六,菱形继…

vue 在线预览word

1 mammoth 先找的是mammoth这个插件yarn add mammoth,版本是1,7.0 参考网上的示例使用如下: import mammoth from "mammoth"; const vHtml ref("") const readExcelFromRemoteFile (url) >{var xhr new XMLHttpRequest();xhr.open("…

前端面试练习24.3.12

目录 flex 布局如何使用 说出 space-between 和 space-around 的区别 介绍下粘性布局(sticky) 特点: 分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用场景。 结构: 继承: 性能:…

ARM/Linux嵌入式面经(四):浙江大华

大华一面 嵌入式 主要是问的项目相关 标准的十五分钟 电话面 这个面试官主要问项目,我同门面的全问八股,可能面试官不一样吧 文章目录 UART串口通信的波特率,常用波特率有哪些串口通信校验方式是什么,有什么区别方便简单的奇偶校验偶校验(even parity)累加和校验CRC循环冗…

柚见第十一期(前端页面开发)

创建队伍 便于控制样式,在外面套一层div 创建假数据模拟后端传来数据 //假数据模拟 const initFormData { "name": "", "description": "", "expireTime": "", "maxNum": 0, "passwor…

未来艺术展览新趋势——3D线上画展如何创新展示?

一、艺术展示的数字化转型 随着科技的不断进步,3D线上画展作为艺术展示的新趋势,正逐渐改变着人们欣赏和购买艺术作品的方式。对于画家而言,3D线上画展不仅提供了一个全新的平台来展示他们的作品,还开辟了销售渠道,扩大…

天梯赛的赛场安排(Python)

作者 陈越 单位 浙江大学 天梯赛使用 OMS 监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担&#…

js中有哪些数据类型,它们有什么区别?

JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。 一、Symbol 和 BigInt 是ES6 中新增的数据类型: 1,Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可…

可视化表单流程编辑器为啥好用?

想要提升办公率、提高数据资源的利用率,可以采用可视化表单流程编辑器的优势特点,实现心中愿望。伴随着社会的进步和发展,提质增效的办公效果一直都是很多职场办公团队的发展需求,作为低代码技术平台服务商,流辰信息团…

【CSP试题回顾】201709-2-公共钥匙盒

CSP-201709-2-公共钥匙盒 关键点 1. 选择恰当的数据结构存储钥匙的存取操作 结构体MyKey包含三个字段:time、opt和index。 time字段表示操作发生的时间点。对于取钥匙的操作,这个时间就是老师上课的开始时间;对于还钥匙的操作&#xff0c…

Ollama 只安装 Ollama,本地快速部署谷歌开源大模型Gemma(基于Ollama)

参考:本地快速部署谷歌开源大模型Gemma(基于Ollama) - 知乎 确保系统更新: Bash sudo apt update && sudo apt upgrade 需要先下载Ollama,版本要求0.1.26及以上 运行curl -fsSL https://ollama.com/install.sh | sh 监听 Ollama API 接…

C++ 之LeetCode刷题记录(三十九)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 目标:执行用时击败90%以上使用 C 的用户。 22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用…

2023年河北省职业院校技能大赛(高职组) “云计算”赛项任务书

2023年河北省职业院校技能大赛 “云计算”赛项任务书 第一场次:私有云(50分)任务一、私有云服务搭建(15分)任务二、私有云服务运维(25分)任务三、私有云运维开发(10分) 第二场次:容器云任务一、容器云服务搭建任务(5分)任务二、容器云应用部署…

2024年春招助学活动:一批FPGA高端项目让你轻松拿到大厂offer

这里写目录标题 1、前言2、FPGA行业现状3、简历怎么写4、FPGA高端项目4.1 图像类:FPGA图像缩放多路视频拼接4.2 通信类:千兆网UDP协议栈4.3 通信类:万兆网UDP协议栈4.4 图像通信综合:FPGA图像缩放UDP网络视频传输4.5 图像高速接口…

零基础学习JS--基础篇--JavaScript类型化数组

JavaScript 类型化数组是一种类似数组的对象,并提供了一种用于在内存缓冲中访问原始二进制数据的机制。 引入类型化数组并非是为了取代 JavaScript 中数组的任何一种功能。相反,它为开发者提供了一个操作二进制数据的接口。这在操作与平台相关的特性时会…

Java SE String类(一):常用方法(上)

1. 常用方法 1.1 字符串构造 String类的常用构造方法只有以下三种 public class Main {public static void main(String[] args) {String s1 "hello";//使用常量串进行构造String s2 new String("hello");//创建String对象char[] array {h,e,l,l,o};…

Be Your Own Teacher 论文阅读

参考文献: Be Your Own Teacher 论文阅读_be your own teacher: improve the performance of co-CSDN博客 Be Your Own Teacher: Improve the Performance of Convolutional Neural Networks via Self Distillation-CSDN博客 Self Distillation 自蒸馏论文解读-C…

DeepLearning in Pytorch|我的第一个NN-共享单车预测

目录 概要 一、数据准备 导入数据 数据可视化 二、设计神经网络 版本一 版本二(正片) 三、测试 小结 概要 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用情况进行预测 输入节点为1个,隐含…