数据库**锁等待(Lock Wait)**调优,核心目标是:减少锁冲突、缩短持锁时间、避免长事务和热点竞争。下面按“定位 → 分析 → 优化”的系统思路说明。
-- 当前锁等待
SELECT * FROM performance_schema.data_lock_waits;
-- 当前事务与锁
SELECT * FROM information_schema.innodb_trx;
SHOW PROCESSLIST;
Oracle
SELECT * FROM v$lock;
SELECT * FROM v$session_wait;
PostgreSQL
SELECT * FROM pg_locks;
SELECT * FROM pg_stat_activity;
✅ 原则:
❌ 错误示例:
BEGIN;
UPDATE account SET balance=balance-1 WHERE id=1;
-- 等待业务逻辑(几秒)
COMMIT;
✅ 优化:
UPDATE account SET balance=balance-1 WHERE id=1;
SET innodb_lock_wait_timeout=5;
❌ 无索引导致锁全表:
UPDATE order SET status=1 WHERE user_name='tom';
-- user_name 无索引 → 行锁变表锁
✅ 建立索引:
CREATE INDEX idx_user ON order(user_name);
stock_1, stock_2, stock_3
UPDATE stock
SET count=count-1
WHERE id=1 AND count>0;
| 隔离级别 | 锁等待风险 |
|---|---|
| READ UNCOMMITTED | 最低 |
| READ COMMITTED | 低 |
| REPEATABLE READ | 中 |
| SERIALIZABLE | 高 |
✅ 一般推荐:
应用层:
try update
catch LockTimeout:
sleep(random)
retry
避免雪崩式重试。
❌
SELECT stock FROM item WHERE id=1;
UPDATE item SET stock=stock-1 WHERE id=1;
✅
UPDATE item
SET stock=stock-1
WHERE id=1 AND stock>0;
锁等待调优 = 短事务 + 好索引 + 合理并发 + 避免热点 + 监控闭环
如果你能告诉我:
我可以给你针对性的 SQL 和架构级方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。