记一次长事务方法带来的坑

news2024/9/21 18:50:04

文章目录

  • 1. 沟通需求
  • 2.分析需求
  • 3. 波折起
  • 4.初版完成
  • 5.锁等待超时
  • 6.消费者超时
  • 7.总结

1. 沟通需求

产品找到我说,咱要将一波数据给更新了,因为涉及业务,就不说具体的内容了,需要支持分页滚动,校对数据后进行推送,大致是需要几万条的明细数据构建出一张大订单,要么同时成功或者失败。

2.分析需求

所以需要实现两个需求,一个是查询分页返回合计信息,第二个是点击确认进行推送。

我一想不是很简单嘛,就立马动手做了,搞个分页,然后让前端滚动合计金额值。

在这里插入图片描述

确认接口直接调用原来的就好。

3. 波折起

于是调试的时候就发现问题了,通过分页的方式,虽然快速返回了数据,但页数很多,到最后推送的时候,还是要让他将最后合计的几万条明细数据推给我,这不就是要查询全部嘛。
在这里插入图片描述

好吧,那只能一次给他返回全部了,合计金额也我来算。

4.初版完成

这样数据勉强能返回了,推送的时候他将数据都给我,我丢到mq里进行处理,由于数据量很大,我只能在接收到数据的时候放到oss中,mq消费的时候再拿出来,这样倒是还行。

但后面前端说不能传那么大的参数,我说那行吧,把query传过来,mq消费后分页查询,再做更新,就这样,初版程序完成了。
在这里插入图片描述

5.锁等待超时

由于我这是一个长事务的操作,每次推送几万条数据得半小时,这样就会有长时间的事务锁行,好在插入的数据比较多,但中间有一个更新操作,每次循环都更新几千条数据,而中途可能会有别人的操作某些行,于是操作就失败了,报错如下。

 java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction
; Lock wait timeout exceeded; try restarting transaction; nested exception is java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction 

在这里插入图片描述

我一查发现是等待锁超时导致的,似乎有个其他的操作的长事务,锁住了某几行数据长达50s,我的更新操作等待就超时了。

好吧,我想到了可以将这大量的更新操作放在所有操作的最后面,这样该操作的占用时间少,比之前的占锁时间少很多。

然后我再添加一个重试机制,不是别的操作占用锁了嘛,我就失败了,等个几秒钟,把异常捕获下,再重试下进行更新,当然,具体的操作我会将异常更新的集合记录下来,先更新其他分组的,最后再统一分组处理。

6.消费者超时

我不是使用了mq嘛,一般处理消息都是快的,但某次消费消息超过了半小时,就给我报了这样的错。

 [2.16.10.43:5672] o.s.a.r.c.CachingConnectionFactory       : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more, class-id=0, method-id=0)

在这里插入图片描述

我一查,好吧,消费者超时,默认消费者的超时时间是30分钟,但我不好改公司的全局配置,且超时时间不好确认,我只好将消息提前确认了。

这样带来的坏处是,一旦服务器重启,那这个任务就会中断,但也好解释,都重启了嘛,让客户之后再操作下,反正有事务控制的。

7.总结

这算是一个折中的方案,暂时先这么用着,起码能保证功能先用着,现实情况往往都是如此,你不可能做的很完美,只能做出权衡利弊后的应对措施。

且很多时候不能从技术方面考虑怎么做,其实是产品设计的有问题,他想的太简单了,应该从功能上进行优化,哎,应该好好沟通来着,给自己埋坑了。

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

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

相关文章

无人机系统的关键技术

一、飞控系统&#xff1a;是无人机完成整个飞行过程的关键&#xff0c;决定了无人机的飞行性能和稳定性。 二、导航系统&#xff1a;提供无人机所需的位置、速度和飞行姿态等信息&#xff0c;引导无人机按照指定航线飞行。 三、动力系统&#xff1a;提供飞行动力&#xff0c;…

报表工具是开源还是商用的好?如何选择适合自己的报表工具?

在当今数字化转型的浪潮中&#xff0c;制作既精确又直观的报表已成为个人高效工作与企业精准沟通的核心工具。然而&#xff0c;面对市场上纷繁复杂的报表工具选项&#xff0c;选择最适合自身或企业需求的那一款&#xff0c;宛如漫步于迷雾笼罩的森林&#xff0c;挑战重重&#…

React 学习——useMemo

useMemo使用场景&#xff1a;消耗非常大的计算&#xff0c;例如递归 import { useMemo, useState } from react; // 缓存&#xff1a;消耗非常大的计算&#xff0c;例如递归 function fib(n){console.log(fib);if(n < 3)return 1;return fib(n-2) fib(n-1); }const App (…

Python开发工具PyCharm v2024.2全新发布——新增Databricks集成

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 立即获取PyCharm v2024.2正式版(Q技术交流&#xff1a;786598704&…

Spark2.x 入门:DStream 转换操作

DStream转换操作包括无状态转换和有状态转换。 无状态转换&#xff1a;每个批次的处理不依赖于之前批次的数据。 有状态转换&#xff1a;当前批次的处理需要使用之前批次的数据或者中间结果。有状态转换包括基于滑动窗口的转换和追踪状态变化的转换(updateStateByKey)。 DStre…

ThreeJs学习笔记--GUI(可视化三维改变场景)

引入gui import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";//具体的看自己本地threejs目录创建gui&#xff08;实例化gui&#xff09; // 实例化一个gui对象 const gui new GUI(); //改变/设置gui操作界面style属性 gui.domElement.style.ri…

【Protobuf】Protobuf 语法介绍

Protobuf 语法介绍 一、 字段规则二、消息类型的定义与使用1、练习——序列化后并写入文件2、练习——从文件中反序列化后打印输出 三、enum 类型1、 定义规则2、 定义时注意事项3、查看枚举类的操作方法4、 实际使用 四、Any 类型1、 介绍2、查看Any类的操作方法3、 实际使用 …

网络安全审计技术原理与应用

网络安全审计概述 概念 定义:对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作 作用:建立“事后”安全保障措施,保存网络安全事件及行为信息,为网络安全事件分析提供线索及证据,以便发现潜在网络安全威胁行为,开展网络安全风险分析及管理 常…

热搜第一!网易云音乐“崩了”

昨日&#xff08;19日&#xff09;&#xff0c;网易云音乐发生故障&#xff0c;迅速登上热搜&#xff0c;引发了广泛关注。 当天下午&#xff0c;有用户反映网易云音乐官网无法访问。同时&#xff0c;网易云音乐App中的会员中心、创作者中心、商城等多个功能均出现异常&#x…

陕西文无文化与韩国RB娱乐签订2000亿韩元合作备忘录

近日&#xff0c;韩国知名制作人、延世大学教授、(株)RB Entertainment 公司社长尹钟豪先生在辰海资本&#xff08;亚州&#xff09;投资有限公司董事、国标舞世界冠军获得者王煜明先生的陪同下&#xff0c;对中国文化市场进行考察调研&#xff0c;先后在北京、西安等地与当地影…

一起学习LeetCode热题100道(47/100)

47.从前序与中序遍历序列构造二叉树(学习) 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9…

nginx变量+rewrite相关功能+反向代理+openresty

目录 1、nginx变量 &#xff08;1&#xff09;内置变量 示例 &#xff08;2&#xff09;自定义变量 示例 2、nginx中的rewrite模块功能 &#xff08;1&#xff09;ngx_http_rewrite_module 模块指令 1&#xff09;if指令 示例 2&#xff09;set指令 示例​编辑 3&am…

代码随想录算法训练营day48:单调栈

目录 739. 每日温度 503.下一个更大元素II 分析&#xff1a; 42. 接雨水 本质&#xff1a; 暴力解法 分析&#xff1a; 双指针优化 单调栈 84.柱状图中最大的矩形 分析&#xff1a; 双指针&#xff1a; 单调栈 739. 每日温度 力扣题目链接(opens new window) 请根…

这个大佬一年连中五篇顶会!

1、SLAM/3DGS/三维点云/医疗图像/扩散模型/结构光/Transformer/CNN/Mamba/位姿估计 顶会论文指导 2、基于扩散模型的跨域鲁棒自动驾驶场景理解 3、基于环境信息的定位&#xff0c;重建与场景理解 4、轻量级高保真Gaussian Splatting 5、基于大模型与GS的 6D pose estimatio…

【Redis】Redis线程与IO模型—(三)

Redis线程与IO模型 一、Redis 单线程二、多路复用机制三、Redis 6.0 多线程特性四、IO 多线程配置 一、Redis 单线程 通常说 Redis 是单线程&#xff0c;主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;其他功能&#xff0c;比如持久化、异步删除、集…

软件测试之全面质量管理

一.什么是TQM&#xff1f; 全面质量管理 英文&#xff1a;Total Quality Management TQM可以被定义为一种管理技术&#xff0c;用于改进与产品相关的过程、产品、服务和其他方法。 它关注的是整个业务&#xff0c;而不仅仅是一个特定的项目或过程。 二.TQM原则 以顾客为关注…

软考作弊率下降了78.68%!官方为了防止作弊做出了哪些努力?

01\软考违纪违规人数对比 2024年上半年软考&#xff08;机考&#xff09;共有52名考生被判违纪违规行为&#xff0c;其中浙江考区有9人&#xff0c;山东枣庄考区有10人&#xff0c;江苏考区有33人。 2023年下半年软考&#xff08;机考&#xff09;共有7名考生被判违纪违规行为…

磁盘格式化文件恢复:一文看懂数据恢复操作

当你意识到关键的硬盘已经被格式化&#xff0c;而且你不能获取里面的内容时&#xff0c;这会是非常令人沮丧的。这种情况可能是因为硬盘被不小心格式化&#xff0c;或者是你在试图修正一些问题、调整文件系统或者释放存储空间时&#xff0c;有意进行的格式化。无论具体情况是什…

【论文学习与撰写】论文中公式的编辑,Mathtype的使用,全文编号排版,智能截图识别公式,公式编号自动更新

1、准备工作 在word中安装mathtype插件&#xff0c; 2、插入公式 在想要插入公式的地方&#xff0c;点击右编号&#xff0c;在里面输入公式&#xff0c;保存&#xff0c;关闭&#xff0c;就会得到插入的公式。 3、公式编号的编辑&#xff0c;公式编号自动更新 要想插入的公式…

笔试练习day5

目录 游游的you题目解析解法方法一贪心方法二 腐烂的苹果题目解析例子1例子2解法多源BFS最短路径代码代码解析 JZ62 孩子们的游戏(圆圈中最后剩下的数)题目解析解法方法一模拟环形链表模拟数组模拟 方法二递推/递归/动态规划状态表示状态转移方程代码 感谢各位大佬对我的支持,如…