使用JDK1.8 parallelStream 引发的 Lock wait timeout exceeded; try restarting transaction

实习踩坑之路:parallelStream并发流+快速失败导致线上CPU300%的血泪史 一个小错误导致线上CPU300%,就差一点提交离职单了 阅读详情

一、背景说明

在线上环境中数据库监控中,突然出现Lock wait timeout exceeded; try restarting transaction 错误,并伴随着大量数据库请求超时报警。

二、了解问题

  • 问题说明
update data_sku SET sku_str ='测试',modified = now() where id = 123
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

该问题发生在Mysql数据库中Innodb 引擎表中,当Innodb 引擎表中出现行锁等待超时并且行锁等待超时,会在等待行锁进程中抛出
Lock wait timeout exceeded; try restarting transaction错误。

  • 数据库行锁配置

在mysql数据库中,innodb_lock_wait_timeout 该参数控制 Innodb 行锁等待的超时时间,可通过以下命令查询数据库配置的当前值。

SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
  • 问题场景

   1) 多台服务器同一时间请求数据库中同一条data_sku数据
   2) 同一个事务对同一条data_sku数据进行插入和修改操作
   3) 并发对一条data_sku进行插入或修改操作
   4) 在查询或修改语句中导致了锁表

三、排查问题

1) 借助mysql数据库工具排查问题

--正在执行的慢SQL记录线程
show  processlist
--当前运行的所有事务
mysql> SELECT * FROM information_schema.INNODB_TRX;
--当前出现的锁
mysql> SELECT * FROM information_schema.INNODB_LOCKs;
--锁等待的对应关系
mysql> SELECT * FROM information_schema.INNODB_LOCK_waits;

注:由于数据库中以上数据一切正常,未能实践中使用到

2) 使用排除法排查问题,根据报错sql语句,在项目中检索查找使用地方,最终确定如下调用代码:

List<MySku> skus = new ArrayList<>();
/**......**/
long failCount = skus.parallelStream()
		.mapToLong(o -> {
			try {
				return skuService.create(o);
			} catch (Throwable e) {
				return -1L;
			}
		})
		.filter(o -> o <= 0)
		.count();

parallelStream并行执行流操作,底层借助fork/join框架提供并发执行能力,非线程安全,并行流在遍历时无法绝对有序。

关于parallelStream的介绍详见:https://blog.youkuaiyun.com/darrensty/article/details/79283146

四、定位问题

1) 结合出错时间日志,发现运营人员多次进行了导入操作,由于前端按钮未做请求控制,最终导致运营人员使用同一个导入文件执行了多次导入操作。
2) 多次导入操作命中到不同服务器,而每个服务器又都使用parallelStream进行的插入操作,最终导致问题的产生

模拟问题重现:在本地环境将mySql数据库,SET  GLOBAL innodb_lock_wait_timeout=1; 将行锁等待的超时时间调低,开发工具类使用多线程调用以上skuService.create(o);方法,最终在测试环境重现问题,详细代码如下所示:

private  void saves(List<MySku> skus){
	for(int i=0;i<10;i++){
		new Thread(new Runnable() {
			@Override
			public void run() {
				long failCount = skus.parallelStream()
						.mapToLong(o -> {
							try {
								return skuService.create(o);
							} catch (Throwable e) {
								return -1L;
							}
						})
						.filter(o -> o <= 0)
						.count();
				System.out.println(failCount);
			}
		}).start();
	}
}

五、解决问题

1) 使用stream流式串行调用skuService.create(o)方法
2) 前端对导入按钮进行控制

SpringBoot实战——仿b站项目(一) 热部署就是当应用程序这种运行的时候升级冉家或者修改某一部分代码、配置文件时,无需手动启动应用,即可修改的部分生效工具 + IDEA配置。 阅读详情

相关推荐

时序基础模型Timer-S1:十亿参数如何革新时间序列预测

时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务,

weixin_29164843的博客 268

springboot 启动 ssl_优化你的 Spring Boot

介绍Jvm优化1.使用-server模式2.指定堆参数3.远程DebugJVM工具远程连接jconsole与Jvisualvm远程连接《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring B...

weixin_39991926的博客 348

Windows下OpenMBEE项目MMS部署失败经历及改正

在Github里找到了上面的第一份文档,下载了MMS源代码(不知道为什么这个代码跟上面操作克隆得到的MMS代码不一样?好像是因为Gradle的版本问题,我本地之前已经安装过7.6.4的Gradle了,于是我找到gradle-wrapper.properties文件。后面在VScode中运行了一下依然是报这个错误,我在VScode终端直接执行。不知道为什么依然没什么用。打开“Windows PowerShell”。(如果是第一次运行它,将看到更长的输出)导航到要克隆存储库的文件夹,例如,

Yo_lan_da的博客 1868

java lock wait_java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

在开发测试过程中发现出了这个问题:RECHARGE:业务,数据: {"platformUserNo":"RPD_1512632756191","amount":6000,"rechargeWay":"SWIFT","bankcode":"ICBK","payCompany":"LANMAO","payMobile":"13428284220","transactionTime":"20171228...

weixin_39520979的博客 357

【报错解决】OpenClaw 报错 EACCES: permission denied:安装权限不足

本文针对国产操作系统环境下使用 npm 安装 OpenClaw 时出现的 EACCES 权限错误,提供了专业解决方案。文章首先分析了问题本质是 npm 全局安装路径与 Linux 权限模型的冲突,然后给出三种解决方案:1)配置用户级 npm 全局目录(推荐);2)使用 nvm 管理 Node.js;3)临时使用 sudo(不推荐)。特别强调在企业环境中应避免使用 root 权限安装,并详细说明了如何正确设置用户级 npm 路径,确保符合生产环境的安全审计要求。该方案同样适用于 OpenEuler、OpenC

博客 3190

基于STM32设计的水质检测系统_333

水质安全对生态环境、农业生产、工业制造以及人类健康至关重要。针对传统水质检测方式检测周期长、成本高、实时性差的问题,本项目设计并实现了一种基于STM32的水质检测系统。系统采用STM32F103RCT6作为主控芯片,集成水温、pH值、电导率和浊度等传感器,能够实时采集水质数据,并通过OLED显示屏进行本地显示。同时,利用Air724UG 4G模块通过MQTT协议将数据上传至华为云IoT平台,实现远程监测。用户可通过Qt5开发的Android手机APP和Windows上位机查看水质数据,并接收超限报警提示。此

713

Jdk8 ParallelStream(并行流),自定义线程池,性能测试,okhttps同步及异步请求,干货,真实开发技术选型。

jdk8并行流,自定义线程池,性能测试,okhttps同步及异步请求

CJ_L1995的博客 2390

OpenClaw使用ClawHub安装skill网络不稳定?Rate limit exceeded报错?试试这个国内高速镜像工具!

使用 ClawHub 安装 Skill 时遇到 🌐 网络不稳、❌ Rate limit 或命令不可用?使用这个镜像工具,轻松解决skill安装问题,⚡

XiaoqiangClub的博客 1260

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

发完版本后大概10分钟左右,所有访问不了,通过日志分析redis连接不上(错误信息图一),最后确定把redis连接池数据改大,服务部分功能能使用,通过日志分析mysql事务一直未提交或者回滚(错误信息图二),一直在等待获取锁,让运维同事先kil,但是没有好转,我们就怀疑是mq消息并发抢资源死锁,长事务问题,我们就把消息先存档,问题还是没有得到解决,我们就尝试重启数据库,还是没有得到解决,分析原因是事务没有提交。在某一天下午发了一个 版本,版本更新内容try catch异常返回错误信息。

qq_39624298的博客 536

人体检测技术之TOF

智能人脸/视频锁领域的人体检测需求是要求远距离达到1m左右即可,一旦在此距离内检测人,则锁唤醒进行人脸识别,视频录制等操作。所以,人体检测技术非常关键。选型主要是几个维度:1.支持检测的距离范围,能否准确输出距离信息2.支持检测FOV3.场景适应性如何,如人体衣服颜色4.环境适应性如何,夏天高温环境下的测距是否准确5.批量一致性情况。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2348

PCB仿真软件:Altium Designer_(15).AltiumDesigner的版本控制与项目管理

在进行PCB设计时,版本控制和项目管理是确保设计质量和团队协作效率的关键。Altium Designer 提供了强大的版本控制和项目管理功能,可以帮助设计团队更好地管理和维护项目。本节将详细介绍如何在Altium Designer中进行版本控制和项目管理,包括如何使用版本控制系统、如何管理项目文件、如何进行团队协作等。

kkchenjj的博客 1202

问题记录:java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction

问题: 在linux下python将数据结果写入mysql时,出现java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction 解决方法: show PROCESSLIST; select * from information_schema.innodb_trx; 锁等待时间超时了,就去查看mysql中的线程,主要看当前运行的线程和INNODB_TRX中的线程,如果INNODB_TRX里面有

qq_43589642的博客 6120

OpenClaw用户必看:每天0成本使用OpenClaw!NVIDIA NIM免费大模型接入教程

🚀 OpenClaw接入NVIDIA NIM免费API!glm5、minimax-m2.5等大量模型任选,0成本升级AI助手!💰

XiaoqiangClub的博客 5574

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

java.sql.SQLException:Lockwaittimeoutexceeded;tryrestartingtransaction问题 1.问题描述   执行了几条update语句之后的,再执行其他的update语句,后台就报如下错误: <-- java.sql.SQLException: Lock wait timeout exceeded; try re...

weixin_30448685的博客 1225

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction的解决办法

MySQL数据库操作的时候遇到这个问题, step1,登录用户使用root权限的用户; step2,SELECT * FROM information_schema.innodb_trx; step3,KILL trx_mysql_thread_id,trx_mysql_thread_id就是innodb_trx中trx_mysql_thread_id列的数据; 完成。 ...

zh_chong的博客 1472

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

BestpayTech的博客 2917

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Lock wait timeout exceeded; try restarting transaction的解决方案

一、 背景介绍 前段时间遇到一个锁超时的问题,错误日志如下: 出现这个问题的背景是:在全表同步的时候,为了提高效率,关闭了自动提交。 statementDelete = conn.prepareStatement(deleteSql.toString()); conn.setAutoCommit(false); 在业务逻辑处理完毕之后,没有手动提交,导致事物(在数据库代码中就是thread)一直处于running的状态。 在下一个任务要用到这个表时,发现之前的事物没哟提交,就会一直等待,然后

xhuiting的博客 5050

项目中遇到的死锁问题 Lock wait timeout exceeded try restarting transaction

最近项目中频繁出现Lock wait timeout exceeded; try restarting transaction这个错误,把我们弄得痛苦不堪啊,为了解决问题,上网上找好多资料,终于把问题复现了。具体操作步骤如下(我使用的mysql工具是navicat): 第一步:开启sql命令页面 第二步:输入start transaction;开启一个事务 第三步:输入update语句 UPDATETABLENAMEset time=null where id=29163;(切记不要...

Data & Analysis 3677

Java Lock wait timeout exceeded; try restarting transaction问题解决

问题描述: Cause:com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException:Lockwaittimeoutexceeded;tryrestartingtransaction 问题分析: 1、执行的insert、update、delete等更新数据库的语句出现了死锁问题。 解决办法: 第一步,执行select * from information_schema.innodb_trx语句,在innodb_trx表...

旭东怪的博客 5224

Caused by: com.primeton.das.entity.impl.hibernate.exception.GenericJDBCException: could not execute

Caused by: com.primeton.das.entity.impl.hibernate.exception.GenericJDBCException: could not execute query 报错信息 .label.deleteLabe_biz : [Name=com.primeton.das.label.label.deleteLabe.biz][activity name=deleteLabe][activity id=invokePojo0] throw an exce

qq_34254090的博客 1999

java报错Lock wait timeout exceeded; try restarting transaction

问题 博主问题是mysql表锁导致无法提交事务 临时处理 可以先kill卡住的线程 show processlist; SELECT * FROM information_schema.INNODB_TRX; 这一列有值就执行。kill 值(pid) 场景 1.模拟事务提交 2.产生死锁 第二条sql一直在等待锁,无法执行 原理 在执行更新操作的时候,存在慢sql,未执行完成就提交新事务,导致代码报错,定位问题为 查询列没有索引,行锁升级到表锁 解决方案 给查询列增加普通索引 结果 不

Jatham_C的博客 1795

MYSQL死锁问题java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

数据库死锁分类 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般算法: 而产生死锁的原因/场景如下: 原理:就像多线程死锁一样,比如线程ab都想写文件t,a操作完T后没有释放锁,b就没法读T了,而且a自己也没法继续

aDiligentCigarette的博客 839

解决 Java 中由于 parallelStream 导致的死锁

并发性是软件开发的福音,也是祸根。通过并行处理提高性能的承诺与错综复杂的挑战相伴而生,例如臭名昭著的。死锁是多线程编程世界中的隐患,它甚至可以使最强大的应用程序陷入瘫痪。它描述了两个或多个线程永远被阻塞,相互等待的情况。在这篇博文中,我们深入探讨了现实世界中因使用 Java 的“”而引发的死锁事件。我们将剖析根本原因,仔细检查线程堆栈跟踪。

周国通的博客 1011

Java8 parallerStream导致Spring项目启动线程阻塞(死锁)

Java8 parallerStream导致Spring项目启动线程阻塞(死锁)分析及解决

boomxiaolong的博客 1313

parallelStream并发流线程安全问题

parallelStream并发流线程安全问题

a116655443322的博客 5338

Java8 parallelStream——共享线程池对性能解析

最近做压测中发现一个应用中cpu过高,导致接口超时rt情况有些不大稳定,jstack打印线程一直在parallelStream相关的代码出进行计算。故对parallelStream相关做一下研究,找一下优化方法。 java8并行流parallelStream,相信很多人都喜欢用,特别方便简单。但是有多少人真正知道里面采用的共享线程池对密集型任务,高并发下的性能影响呢 可能你的一个应用里面...

weixin_42330218的博客 3790
上一篇: Cannot expose request attribute 'userName' because of an existing model object of the same name
下一篇: CMS 升级到G1遇到RSS内存泄漏问题
TimerBin
博客等级 码龄12年 54粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值