如何手动释放MySQL行锁?解决行更新锁等待超时异常
手动释放MySQL行锁的操作步骤
针对你遇到的特定行锁等待超时、重启应用锁仍未释放的情况,直接按以下步骤操作:
定位持有锁的事务与进程
执行以下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且启动时间较早。确认锁阻塞关系
如果需要更明确的阻塞链,执行以下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能看到该进程正在执行的语句。手动杀掉持有锁的进程
拿到blocking_thread对应的数值后,执行KILL命令强制终止该进程,锁会随之释放:KILL [blocking_thread];比如查到进程ID是145,就执行
KILL 145;
补充说明
- 为什么重启应用锁没释放?因为行锁是MySQL服务器端维护的,未提交的事务不会随应用重启而终止,锁会一直持有直到事务提交/回滚或进程被杀死。
- 预防建议:
- 确保应用中所有事务都能及时提交或回滚(尤其是异常分支,比如捕获到错误后要执行回滚操作);
- 避免在事务中执行耗时操作(比如远程调用、大文件读写),减少锁持有时间;
- 若频繁出现锁等待,可临时调整
innodb_lock_wait_timeout参数增大等待时间,但这只是临时缓解,核心还是要解决事务未正常结束的问题。
内容的提问来源于stack exchange,提问作者Mehdi Varse
相关产品推荐
相关产品推荐

