锁等待超时

news2025/1/31 11:18:52

问题背景

今天测试同事发现项目里面大部分接口报错,把日志捞出来看了下出现大量的锁等待超时的错误。

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
	at com.mysql.jdbc.Util.getInstance(Util.java:408)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3933)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)

这个提示就是数据库数据库锁等待超时。

排查问题

排查问题主要用到的sql,可以参考文章最后相关表的说明

## 当前运行的所有事务
select * from information_schema.innodb_trx;   
## 当前出现的锁
select * from information_schema.innodb_locks;  
## 锁等待的对应关系
SELECT * FROM information_schema.innodb_lock_waits;
## innodb_trx.trx_mysql_thread_id:事务线程 ID,可以和 PROCESSLIST 表 JOIN
SELECT * from information_schema.processlist WHERE id = xxx; 
## 展示所有的连接数据
show full processlist;

trx_state状态为RUNNING就表示这个事物还在运行中,没有提交。LOCK_WAIT就是被阻塞了,需要等前面RUNNING的提交了才能到自己这边运行。这边可以看到UPMS_USER表就是这个情况。

可以通过kill trx_mysql_thread_id来杀掉这个线程暂时解决这个问题,但是这样只是解决一时的问题。我们还需要找到发生问题的具体原因。

在这里插入图片描述

这几个事物都被上锁了

在这里插入图片描述

锁的等待关系,可以对照innodb_trx表来看。

在这里插入图片描述

查一下

## xxx为innodb_trx.trx_mysql_thread_id:事务线程 ID
SELECT * from information_schema.processlist WHERE id = xxx; 

结果发现报错了。mysql的tmpdir空间不够。tmpdir主要用来存储一些中间的临时数据。

### Cause: java.sql.SQLException: Disk full (/data/mysql/tmp/#sql_1eaa2_60.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1021]; Disk full (/tmp/#sql_1eaa2_60.MAI); waiting for someone to free some space... (errno: 28 "No space left on device"); nested exception is java.sql.SQLException: Disk full (/data/mysql/tmp/#sql_1eaa2_60.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")
    at

很明显就是磁盘空间不足了。

查看磁盘空间,发现已经使用100%了。

在这里插入图片描述

清理磁盘空间

除了上面的磁盘空间不足会引起这个问题,还可能是有大的事物导致执行时间过长,阻塞了其它的请求。遇到这种情况就需要优化业务,可以把大的事物进行拆分。通过减少事物持有锁的时间来解决问题。

errno: 11 "Resource temporarily unavailable

上面把磁盘空间清理后,发现项目的接口还是报错。报错日志如下。

### Cause: java.sql.SQLException: Error writing file '/data/mysql/binlog/bin-log-mysqld' (errno: 11 "Resource temporarily unavailable")
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1026]; Error writing file '/data/mysql/binlog/bin-log-mysqld' (errno: 11 "Resource temporarily unavailable"); nested exception is java.sql.SQLException: Error writing file '/data/mysql/binlog/bin-log-mysqld' (errno: 11 "Resource temporarily unavailable")
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) ~[mybatis-spring-2.0.1.jar:2.0.1]
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) ~[mybatis-spring-2.0.1.jar:2.0.1]
	at com.sun.proxy.$Proxy140.update(Unknown Source) ~[?:?]
	at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:294) ~[mybatis-spring-2.0.1.jar:2.0.1]

去看了msyql的日志,定位到刚开始报错的位置

2022-12-19  5:52:31 140613203285760 [Warning] mysqld: 2022-12-19 13:59:07 140613203285760 [ERROR] mysqld: Error writing file '/data/mysql/bin-log-mysqld' (errno: 28 "No space left on device")
2022-12-19 13:59:07 140612815456000 [ERROR] mysqld: Error writing file '/data/mysql/bin-log-mysqld' (errno: 28 "No space left on device")
2022-12-19 13:59:07 140613207586560 [ERROR] mysqld: Error writing file '/data/mysql/bin-log-mysqld' (errno: 28 "No space left on device")
2022-12-19 13:59:07 140612812076800 [ERROR] mysqld: Error writing file '/data/mysql/bin-log-mysqld' (errno: 28 "No space left on device")
2022-12-19 13:59:07 140617973192448 [ERROR] mysqld: Error writing file '/data/mysql/bin-log-mysqld' (errno: 28 "No space left on device")
2022-12-19 13:59:07 140611924596480 [ERROR] mysqld: Error writing file '/data/mysql/binlog/bin-log-mysqld' (errno: 11 "Resource temporarily unavailable")

发现最早是因为磁盘空间不足导致无法写入bin-log,但是我们已经清理过磁盘了。

重启mysql就没有在报这个错误了。

字段描述

innodb_trx 表的字段描述:

字段描述
trx_id事务ID
trx_state事务状态,有以下几种状态:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。
trx_started事务开始时间。
trx_requested_lock_id事务当前正在等待锁的标识,可以和 INNODB_LOCKS 表 JOIN 以得到更多详细信息。
trx_wait_started事务开始等待的时间。
trx_weight事务的权重。
trx_mysql_thread_id事务线程 ID,可以和 PROCESSLIST 表 JOIN。
trx_query事务正在执行的 SQL 语句。
trx_operation_state事务当前操作状态。
trx_tables_in_use当前事务执行的 SQL 中使用的表的个数。
trx_tables_locked当前执行 SQL 的行锁数量。
trx_lock_structs事务保留的锁数量。
trx_lock_memory_bytes事务锁住的内存大小,单位为 BYTES。
trx_rows_locked事务锁住的记录数。包含标记为 DELETED,并且已经保存到磁盘但对事务不可见的行。
trx_rows_modified事务更改的行数。
trx_concurrency_tickets事务并发票数。
trx_isolation_level当前事务的隔离级别。
trx_unique_checks是否打开唯一性检查的标识。
trx_foreign_key_checks是否打开外键检查的标识。
trx_last_foreign_key_error最后一次的外键错误信息。
trx_adaptive_hash_latched自适应散列索引是否被当前事务锁住的标识。
trx_adaptive_hash_timeout是否立刻放弃为自适应散列索引搜索 LATCH 的标识。

innodb_locks 表的字段描述

字段描述
lock_id锁 ID
lock_trx_id拥有锁的事务 ID。可以和 INNODB_TRX 表 JOIN 得到事务的详细信息。
lock_mode锁的模式。有如下锁类型:行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。
lock_type锁的类型。RECORD 代表行级锁,TABLE 代表表级锁。
lock_table被锁定的或者包含锁定记录的表的名称。
lock_index当 LOCK_TYPE=’RECORD’ 时,表示索引的名称;否则为 NULL。
lock_space当 LOCK_TYPE=’RECORD’ 时,表示锁定行的表空间 ID;否则为 NULL。
lock_page当 LOCK_TYPE=’RECORD’ 时,表示锁定行的页号;否则为 NULL。
lock_rec当 LOCK_TYPE=’RECORD’ 时,表示一堆页面中锁定行的数量,亦即被锁定的记录号;否则为 NULL。
lock_data当 LOCK_TYPE=’RECORD’ 时,表示锁定行的主键;否则为NULL。

innodb_lock_waits 字段描述

字段描述
requesting_trx_id请求事务的 ID。
requested_lock_id事务所等待的锁定的 ID。可以和 INNODB_LOCKS 表 JOIN。
blocking_trx_id阻塞事务的 ID。
blocking_lock_id某一事务的锁的 ID,该事务阻塞了另一事务的运行。可以和 INNODB_LOCKS 表 JOIN。

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

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

相关文章

MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square论文阅读

1. 摘要 随着自动驾驶与移动建图的快速发展,实际项目中对现成的激光SLAM建图方案的需求也越来越强烈,并且要求解决方案适用于各种不同规格的激光雷达与各种复杂场景。因此,我们提出了MULLS,一种高效,低漂移&#xff0…

状态观测控制器设计与仿真验证

【无限嚣张(菜菜)】:hello您好,我是菜菜,很高兴您能来访我的博客,我是一名爱好编程学习研究的菜菜,每天分享自己的学习,想法,博客来源与自己的学习项目以及编程中遇到问题…

深度学习炼丹-数据处理和增强

前言一,Normalization 概述 1.1,Normalization 定义1.2,什么情况需要 Normalization1.3,Data Normalization 方法1.4,示例代码 二,normalize images 2.1,图像 normalization 定义2.2&#xff0c…

[XCTF]halo(2019护网杯)(难度2)

目录 前言 一、题目重述 二、解题思路 1.Base64解密 2.难以想到的异或运算 三、flag 总结 前言 注意!攻防世界题目有误!!给出题目与原题不一样但是答案却和护网杯原题答案一样!! 一、题目重述 aWdxNDs0NDFSOz…

NVM Express Base Specification 2.0c - 2 Theory of Operation

The interface has the following key attributes: 在命令提交或完成路径中不需要非缓存/ MMIO寄存器读取;在命令提交路径中最多需要一个MMIO寄存器写或一个64B消息;支持多达65,535个I/O队列,每个I/O队列支持多达65,535个未完成的命令;优先级与每个I/O队列相关联&a…

【MySQL】基于InnoDB的数据库索引

文章目录前言1、索引引入2、索引语法2.1、创建索引2.2、查看索引2.3、删除索引2.4、案例引入3、索引结构3.1、概述3.2、引擎支持3.3、BTree3.4、Hash4、索引类别4.1、分类4.2、过程分析5、性能分析5.1、执行频率5.2、慢查询日志5.3、explain6、最左前缀原则7、索引失效7.1、范围…

2023年学一门IT技术的最佳选择就是软件测试!

互联网行业的不断发展,也增加了IT行业的就业机会,作为最适合零基础小白入行、门槛低的软件测试岗位来说,也受到越来越多转行者的关注,但是耳边依然充斥着各种关于这个行业不好的言论,诸如“行业饱和了,学完…

华为OD机试真题 Python 实现【最长连续方波信号】

目录 题目 思路 考点 Code 题目 输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,如果有相同长度的交替方波信号,输出任一即可, 方波信号高位用1标识,低位用0标识,如图: 说明: 1) 一个完整的信号一定以0开始然后以0结尾,即010是一个完整信号,但10…

【自动化】【autojs】02 autox环境搭建和踩坑

▒ 目录 ▒🛫 导读需求开发环境1️⃣ 环境搭建AutoXadbVSCode插件scrcpy2️⃣ ADB方式实战控制微信启动正确设置autox选项启动服务执行代码停止代码执行3️⃣ 踩坑函数id需要传递全名称app.launch未生效ui.layout报错📖 参考资料🛫 导读 需求…

基于区块链技术的信息服务新架构探讨

【摘 要】为探索区块链技术对信息通信基础架构的影响及实现,在梳理信息技术架构和信息服务架构演进的基础上,分析了区块链新型数字化分布式账本体系赋予数字世界生产关系升级的功能,并基于“云-管-端-边”信息服务架构研究了区块链技术实现信息物理空间中“设备民主”的具体…

EL表达式与JSTL标签库(JSP标准标签库)

EL表达式 EL 全名为Expression Language,是表达式语言。 EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出。因为EL表达式在输出数据的时候,要比jsp的表达式脚本要简洁很多。 不需要加任何jar包。不依赖任何其它库。提供了在脚本元素…

《软件开发本质论》笔记——了解价值,然后从可能去做的所有事情中选择那些最重要的去做

目录 一、传统的软件项目分阶段进行 二、根据”挑战性的目标“制订计划,危害性很大 三、推荐随时发现缺陷随时修复 四、 价值是什么 一、传统的软件项目分阶段进行 潜在风险:试图去计划并实现所有的功能特性,这使我们处于不利的境地。我们…

转行互联网,零基础应届生应该选择什么样的岗位作为切入点?

对于想要转行互联网的零基础小白,如果你耐心看完了这个答案,恭喜你已经找到了转行互联网的方法!我不说空的理论,也不讲心灵鸡汤,作为文艺青年,我只说经验,我是工作十三年的互联网老兵&#xff0…

整合第三方登录之微信扫码登录

📂文章目录🎓前言🏷️引入相关依赖🧱操作步骤📔生成微信登录二维码📔获取微信用户信息并实现微信注册登录💗总结🎓前言 前置条件:具备微信开发者资质。 通过微信开放平…

Contest2874 - 【在线编程平台】2022年计算机类数据结构作业14.20221215-1220

目录 问题 A: 大顶堆还是小顶堆? 问题 B: sort by age 问题 C: 统计字母个数 问题 D: 字母排序 问题 E: 算法10-6~10-8:快速排序 问题 A: 大顶堆还是小顶堆? 内存限制:128 MB时间限制:1.000 S标准输入输出 题目类…

数学建模国赛 2020B-穿越沙漠 第二关至第六关思路分享

穿越沙漠第二关至第六关思路 开始讲题之前唠嗑一下: 很感谢所有读者和粉丝对上一篇的第一关解题博文的喜欢,也收到很多人的称赞,我很高兴大家能喜欢我写的东西。 其实这道题的模型在建立之处就是对着六关通用的目标去写的,因为本…

现货黄金时间表怎么安排?

现货黄金交易时间表,最好每一个投资者打印一份出来,放在你的电脑旁边。为什么呢?以前我对现货黄金交易时间表也没有特别关心,为什么在二十四小时的全天候交易要花时间到这里面来呢? 黄金市场是一个全球性的市场&#x…

APP测试技术:ADB——安卓手机测试一座神奇的“桥”

前言: 近年移动互联网好比IT界的一条浩瀚银河,安卓手机测试可谓其中最璀璨的一颗明珠,这里有一座你不得不熟悉的桥--ADB 曾见过不少相关的文章或培训,不乏空谈多,实战少;期望大,效果差。也见过…

idea上传代码到GitHub,每一步附带注意事项(炒鸡炒鸡详细)

1. idea配置git 2. 在idea里面登录自己的GitHub账号 需要到GitHub生成token 点击后,翻到最底部,点击左侧导航栏的Developer settings,到达下面这张图 最后点击最底部的绿色按钮,然后复制token即可。 3. 在创建本地仓库&#xff0…

【强化学习基础】强化学习的基本概念:状态、动作、智能体、策略、奖励、状态转移

文章目录1.状态(State)2.动作(Action)3.智能体(Agent)4.策略(Policy)5.奖励(Reward)6.状态转移(State transition)7.智能体与环境交互…