You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动释放MySQL行锁?解决行更新锁等待超时异常

手动释放MySQL行锁的操作步骤

针对你遇到的特定行锁等待超时、重启应用锁仍未释放的情况,直接按以下步骤操作:

  1. 定位持有锁的事务与进程
    执行以下SQL查询InnoDB事务信息,找到持有目标行锁的进程ID:

    SELECT 
      trx_id,
      trx_state,
      trx_started,
      trx_mysql_thread_id,
      trx_query
    FROM INFORMATION_SCHEMA.INNODB_TRX;
    

    重点关注trx_mysql_thread_id(MySQL进程ID)和trx_query(事务执行的语句),找到和你那行更新相关的未提交事务——这类事务通常状态是RUNNING且启动时间较早。

  2. 确认锁阻塞关系
    如果需要更明确的阻塞链,执行以下SQL直接查看谁在阻塞你的更新请求:

    SELECT
      r.trx_id AS waiting_trx_id,
      r.trx_mysql_thread_id AS waiting_thread,
      b.trx_id AS blocking_trx_id,
      b.trx_mysql_thread_id AS blocking_thread,
      b.trx_query AS blocking_query
    FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS w
    JOIN INFORMATION_SCHEMA.INNODB_TRX b ON w.blocking_trx_id = b.trx_id
    JOIN INFORMATION_SCHEMA.INNODB_TRX r ON w.requesting_trx_id = r.trx_id;
    

    结果里的blocking_thread就是持有锁的进程ID,blocking_query能看到该进程正在执行的语句。

  3. 手动杀掉持有锁的进程
    拿到blocking_thread对应的数值后,执行KILL命令强制终止该进程,锁会随之释放:

    KILL [blocking_thread];
    

    比如查到进程ID是145,就执行KILL 145;

补充说明

  • 为什么重启应用锁没释放?因为行锁是MySQL服务器端维护的,未提交的事务不会随应用重启而终止,锁会一直持有直到事务提交/回滚或进程被杀死。
  • 预防建议:
    • 确保应用中所有事务都能及时提交或回滚(尤其是异常分支,比如捕获到错误后要执行回滚操作);
    • 避免在事务中执行耗时操作(比如远程调用、大文件读写),减少锁持有时间;
    • 若频繁出现锁等待,可临时调整innodb_lock_wait_timeout参数增大等待时间,但这只是临时缓解,核心还是要解决事务未正常结束的问题。

内容的提问来源于stack exchange,提问作者Mehdi Varse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:25:00