“锁等待(Lock Wait / 锁阻塞)”是数据库和多线程开发中非常常见的问题。要解决它,需要先定位原因,再针对性处理。下面我按「通用思路 → 数据库场景 → 代码/并发场景 → 预防建议」来说明。
确认是否真的在等锁
lock wait timeout、blocking sessionsynchronized / Lock.lock()找到“持锁者”
判断锁类型
常见原因
BEGIN 后忘了 COMMIT)排查方法
-- 查看当前锁等待
SELECT * FROM information_schema.innodb_lock_waits;
-- 查看事务
SELECT * FROM information_schema.innodb_trx;
-- 查看进程
SHOW PROCESSLIST;
解决方法
KILL <trx_mysql_thread_id>;
SET innodb_lock_wait_timeout = 30;
SELECT * FROM v$lock;
SELECT * FROM v$session WHERE blocking_session IS NOT NULL;
解决
blocking_sessionALTER SYSTEM KILL SESSION 'sid,serial#';SELECT * FROM pg_locks;
SELECT * FROM pg_stat_activity WHERE wait_event_type = 'Lock';
原因
解决
Lock + tryLockif (lock.tryLock(1, TimeUnit.SECONDS)) {
try {
// do work
} finally {
lock.unlock();
}
}
特征
排查
jstack <pid>
看 deadlock 关键字
解决
❌ 在事务里:
✅ 正确做法:
version 字段)如果你能告诉我:
Lock wait timeout exceeded)我可以给你更精准的解决方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。