第 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;关键推理
等待图比“数据库卡了”更接近根因;死锁需要统一访问顺序或正确重试。
可替代方案
为关键事务设置超时与告警,并缩短持锁时间。
典型错误
只杀等待者不查持有者,或把死锁当成系统异常而不做幂等重试。
复盘时请附上版本、隔离级别、执行计划或恢复位置中的相关证据;没有证据的“看起来正确”不算完成。