MySQL事务阻塞卡死问题完整排查与解决流程

 更新时间:2026年09月22日 09:04:22   作者:爱码猿  
在 MySQL 日常运维、业务开发过程中,经常会遇到接口超时、SQL 执行卡死、数据库锁等待、事务阻塞的问题,大多场景都是因为长事务、未提交事务、行锁竞争导致的事务阻塞,本文给大家分享一套从零排查阻塞事务、定位阻塞SQL、精准kill问题线程的完整实战流程

引言

在 MySQL 日常运维、业务开发过程中,经常会遇到接口超时、SQL 执行卡死、数据库锁等待、事务阻塞的问题。大多场景都是因为长事务、未提交事务、行锁竞争导致的事务阻塞。

本文给大家分享一套从零排查阻塞事务、定位阻塞SQL、精准kill问题线程的完整实战流程,语句可直接复制复用,快速解决MySQL锁等待、事务卡死问题。

一、问题场景概述

当出现以下现象时,基本可以判定是MySQL事务阻塞导致:

  • 单条UPDATE/DELETE/INSERT语句长时间执行不结束
  • 业务接口请求超时、响应缓慢
  • 数据库CPU、内存无异常,但QPS骤降
  • 频繁出现 Lock wait timeout exceeded 锁等待超时报错

核心原因:一个事务持有行锁未提交,导致后续请求的事务阻塞等待,形成锁等待链路。

二、完整排查解决流程

整套流程分为4个步骤:查询阻塞关系 → 根据线程PID查内核线程ID → 定位阻塞源头SQL → 杀死阻塞线程恢复服务。

1. 查看所有被阻塞的事务与阻塞源头

通过 `innodb_lock_waits` 和 `innodb_trx` 系统表,直接查询出等待事务和源头阻塞事务的对应关系,是排查锁阻塞的核心语句。

-- 查看事务阻塞关系:等待事务、阻塞事务、对应SQL、线程ID
SELECT
    r.trx_id AS waiting_trx_id,        -- 被阻塞的事务ID
    r.trx_mysql_thread_id AS waiting_thread,  -- 被阻塞的业务线程PID
    r.trx_query AS waiting_query,      -- 被阻塞的SQL语句
    b.trx_id AS blocking_trx_id,       -- 阻塞别人的源头事务ID
    b.trx_mysql_thread_id AS blocking_thread, -- 阻塞源头线程PID
    b.trx_query AS blocking_query      -- 造成阻塞的源头SQL
FROM information_schema.innodb_lock_waits w
         INNER JOIN information_schema.innodb_trx b
                    ON b.trx_id = w.blocking_trx_id
         INNER JOIN information_schema.innodb_trx r
                    ON r.trx_id = w.requesting_trx_id;

字段说明

  • waiting_trx/waiting_thread/waiting_query:正在等待锁、被卡住的事务、线程、SQL
  • blocking_trx/blocking_thread/blocking_query:持有锁、导致别人阻塞的源头事务、线程、SQL

通过该语句可以直接定位到:到底是哪一条SQL、哪一个线程卡住了整个业务。

2. 根据业务线程PID查询内核线程ID

通过第一步查询到的 `blocking_thread`(PROCESSLIST_ID),查询对应的数据库内核线程 THREAD_ID,用于精准定位线程详情。

-- 根据业务线程PID查询内核线程ID(替换为自己查询到的PID)
SELECT THREAD_ID
FROM performance_schema.threads
WHERE PROCESSLIST_ID = 10146;

参数说明:将 `10146` 替换为第一步查到的 blocking_thread 阻塞线程ID。

3. 查询阻塞线程正在执行的完整SQL

通过上一步获取的 THREAD_ID,查询线程当前正在执行的真实SQL,确认阻塞源头业务语句。

-- 根据内核线程ID,查询当前执行的SQL语句
SELECT THREAD_ID, SQL_TEXT
FROM performance_schema.events_statements_current
WHERE THREAD_ID = 10146;

该语句可以精准拿到造成锁阻塞的原始SQL,方便后续复盘优化(比如未加索引、长事务、事务未提交等问题)。

4. 杀死阻塞线程,恢复业务

确认阻塞线程和问题SQL后,直接Kill掉阻塞源头线程,释放锁,恢复正常业务访问。

-- 杀死阻塞线程(替换为第一步查询到的 blocking_thread 值)
KILL xxx;

注意:kill 阻塞线程(blocking_thread),不要kill被阻塞的线程,kill源头才能彻底释放锁。

三、核心原理简单说明

  1. information_schema.innodb_trx:记录当前InnoDB所有运行中的事务信息,包含事务ID、线程ID、执行SQL、事务状态
  2. information_schema.innodb_lock_waits:专门记录锁等待关系,是阻塞排查的核心视图
  3. performance_schema:性能监控库,可精准查询线程对应的真实执行SQL

四、常见阻塞原因与优化方案

1. 事务执行时间过长(长事务)

业务代码中事务开启后,执行大量业务逻辑、网络请求,迟迟不commit,长期持有行锁。

优化:缩小事务范围,事务内只做数据库操作,避免事务嵌套业务逻辑。

2. 更新/删除语句无索引

WHERE条件无索引,导致行锁升级为表锁,阻塞全表所有读写操作。

优化:保证UPDATE/DELETE语句WHERE字段建立索引。

3. 程序异常导致事务未提交

代码报错、接口中断,导致事务未执行commit/rollback,线程挂起持有锁。

优化:全局异常捕获,确保事务最终一定会提交或回滚。

五、排查总结(速查清单)

  1. 执行阻塞查询SQL,找到 blocking_thread 阻塞源头线程
  2. 通过PID查询内核线程ID,核对阻塞SQL
  3. 确认无误后 KILL 阻塞线程,快速恢复业务
  4. 根据阻塞SQL复盘代码,解决长事务、无索引、事务未提交问题

六、补充:日常预防建议

  • 禁止大事务、长事务,单事务执行时间控制在毫秒/秒级
  • 所有更新语句必须走索引,避免行锁变表锁
  • 开启MySQL慢查询日志,监控超时SQL
  • 定时巡检数据库长事务,提前规避阻塞问题

以上就是MySQL事务阻塞卡死问题完整排查与解决流程的详细内容,更多关于MySQL事务阻塞卡死问题的资料请关注脚本之家其它相关文章!

相关文章

  • mysql中的数据目录用法及说明

    mysql中的数据目录用法及说明

    这篇文章主要介绍了mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • MySQL中数据查询语句整理大全

    MySQL中数据查询语句整理大全

    查询语句是以后在工作中使用最多也是最复杂的用法,如何精准的查询出想要的结果以及用最合理的逻辑去查询尤为重要,下面这篇文章主要给大家介绍了关于MySQL中数据查询语句的相关资料,需要的朋友可以参考下
    2023-04-04
  • MySQL服务器的SSD性能问题分析和测试详解

    MySQL服务器的SSD性能问题分析和测试详解

    这篇文章主要给大家介绍了关于MySQL服务器的SSD性能问题分析和测试的相关资料,文中图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • MySQL容灾备份的实现方案

    MySQL容灾备份的实现方案

    进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下
    2025-08-08
  • SQL使用WHERE条件语句的项目实践

    SQL使用WHERE条件语句的项目实践

    本文将介绍WHERE子句中使用的通用语法,它还将概述如何在单个WHERE子句中组合多个搜索条件谓词以更细粒度的方式过滤数据,以及如何使用NOT操作符排除而不是包含满足给定搜索条件的行,感兴趣的可以了解一下
    2023-09-09
  • MySQL实现分布式锁的三种主流方案

    MySQL实现分布式锁的三种主流方案

    MySQL 实现分布式锁的核心是利用数据库的原子性、唯一性约束或行级锁机制,保证分布式系统中多个节点对共享资源的互斥访问,解决跨进程、跨服务器的并发竞争问题,以下是三种主流、可靠且覆盖不同业务场景的实现方案,需要的朋友可以参考下
    2026-02-02
  • MySQL limit性能分析与优化

    MySQL limit性能分析与优化

    今天小编就为大家分享一篇关于MySQL limit性能分析与优化,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • MySQL8.2.0安装教程分享

    MySQL8.2.0安装教程分享

    这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤
    2025-02-02
  • SQL字段拼接成新字段几种常见的方法

    SQL字段拼接成新字段几种常见的方法

    这篇文章主要给大家介绍了关于SQL字段拼接成新字段几种常见的方法,如我们在选择商品的时候不止需要知道商品的名字,还需要商品代码型号等,这个时候需要把这些字段拼接为一个字段进行操作或者输出,需要的朋友可以参考下
    2023-08-08
  • 简单了解mysql语句书写和执行顺序

    简单了解mysql语句书写和执行顺序

    这篇文章主要介绍了简单了解mysql语句书写和执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论