Skip to content

第 9 站练习答案 ​

← 本站索引

捕获阻塞与死锁 ​

sql
SELECT *
FROM performance_schema.data_lock_waits;

SHOW ENGINE INNODB STATUS;

合格证据包含两个事务各自持有和等待的锁、索引、记录、语句及最终牺牲者。

稳定锁顺序 ​

sql
START TRANSACTION;
UPDATE sales_order
SET version_no = version_no + 1
WHERE order_id IN (1, 2)
ORDER BY order_id;
COMMIT;

所有代码路径都按相同顺序访问资源才能降低环形等待;单个示例成功不能证明没有其他路径。

MDL 实验中,先查询 performance_schema.metadata_locks 并找到持有者,再决定等待、取消 DDL 或终止会话。

加码题解:锁、死锁与 MDL ​

sql
SELECT waiting_pid, blocking_pid, waiting_query
FROM sys.innodb_lock_waits;

关键推理 ​

等待图比“数据库卡了”更接近根因;死锁需要统一访问顺序或正确重试。

可替代方案 ​

为关键事务设置超时与告警,并缩短持锁时间。

典型错误 ​

只杀等待者不查持有者,或把死锁当成系统异常而不做幂等重试。

复盘时请附上版本、隔离级别、执行计划或恢复位置中的相关证据;没有证据的“看起来正确”不算完成。

用心记录每一步成长