数据库锁与死锁。

考查重点:锁冲突与循环等待。锁让冲突操作等待;事务按相反顺序拿锁可形成等待环,统一加锁顺序、缩短事务并对死锁回滚重试

本题目录

参考答案

核心回答

数据库锁用于协调并发访问,避免不兼容的操作同时破坏数据约束。以MySQL InnoDB为例,既有记录和范围相关的锁,也有表级意向锁、元数据锁等;锁的实际范围受语句、索引和隔离级别影响。

死锁是多个事务互相等待对方持有的锁,形成等待环。例如事务A先锁账户1、再等账户2,事务B先锁账户2、再等账户1,双方都不能继续。它不同于单纯等待一个最终会结束的长事务。

先区分几类机制

记录锁保护索引记录;间隙锁保护索引记录之间的间隙,主要限制插入;Next-Key Lock结合记录和前方间隙。不是每次查询都加这三类锁,唯一键等值查询、范围查询以及RC/RR隔离级别的行为不同。

共享锁与排他锁表达兼容关系:排他锁会阻止其他不兼容加锁,但普通MVCC快照读通常无需因这把记录锁等待。锁定读则读取当前可用数据并获取相应锁,事务提交或回滚后释放相关事务锁。

意向锁表明事务准备在表内获取某类行锁,便于协调表锁;元数据锁保护表结构访问,DDL等待也可能来自长事务,不能把所有“数据库卡住”都当行锁死锁。

死锁怎样处理

统一多资源加锁顺序,缩短事务,减少扫描和持锁范围,不在事务中等待外部服务。InnoDB通常会检测死锁并回滚一个受害者,应用仍需识别错误、清理当前事务,必要时在幂等基础上有限重试。

排查时查看死锁记录、持锁与等待语句、事务持续时间及实际索引扫描范围。单纯增大锁等待超时不能消除等待环;降低隔离级别也不能保证不再死锁。

追问

应用使用版本号乐观更新,数据库底层执行更新仍可能用锁。乐观策略解决的是并发冲突的检测方式,并不意味着多语句事务绝无死锁。

参考资料

相关面经

4 篇

科大讯飞、首都在线、宇量晟、四川长虹、度小满、字节跳动、恒生电子、腾娱互动、金蝶、汽车之家

面经合集
查看原面经 →
重返帝国项目组。八股多,死锁成因以及解决方案,mysql怎么解决死锁,查看死锁命令有哪些,jvm调优思路,手撕链表,以及一些基础的操作链表方法。一共一个小时。

字节跳动

后端开发工程师
秋招一面
查看原面经 →
MySQL锁了解吗,互斥锁怎么实现的底层原理

百度

Agent 开发工程师
一面
查看原面经 →
锁,死锁

快手

Agent 开发工程师
二面
查看原面经 →
mysql的锁有哪些?

收录题集

1 个来源,共2 份题集

百度高频面试题

Rocky Ding · AIGC-Interview-Book · 1 条原题

查看题集 →

字节跳动高频面试题

Rocky Ding · AIGC-Interview-Book · 1 条原题

查看题集 →

相关题目

4 题