【大白话说Java面试题 第86题】【Mysql篇】第16题:MySQL 中锁的种类与行锁实现原理? PDF大白话说Java面试题 — 03-Mysql篇第16题MySQL 中锁的种类与行锁实现原理回答核心考点大厂面试要求深入理解锁的分类体系、InnoDB行锁的底层实现、各种锁的加锁时机与兼容性以及行锁与隔离级别的关联。面试官常追问“Record Lock、Gap Lock、Next-Key Lock有什么区别”、“意向锁的作用是什么”、“行锁是怎么在索引上实现的”1. 锁的完整分类体系MySQL的锁可以从三个维度分类加锁思想、锁粒度、锁类型。分类维度类型说明加锁思想乐观锁 / 悲观锁逻辑上的并发控制策略非数据库内置锁锁粒度表锁 / 页锁 / 行锁锁的范围大小锁类型InnoDB行锁Record Lock / Gap Lock / Next-Key Lock / Insert Intention LockInnoDB行锁的具体实现表级辅助锁意向锁IS/IX用于表锁与行锁的协调2. 乐观锁 vs 悲观锁并发控制思想对比乐观锁悲观锁核心思想假设冲突少先操作后检测假设冲突多先加锁后操作实现方式版本号version、CASSELECT FOR UPDATE、LOCK IN SHARE MODE是否数据库内置否应用层实现否依赖于数据库提供的锁适用场景读多写少写多读少乐观锁示例-- 使用version字段实现乐观锁UPDATEproductsSETstockstock-1,versionversion1WHEREid1ANDversion5;-- 检查affected_rows为0则重试悲观锁示例STARTTRANSACTION;SELECT*FROMproductsWHEREid1FORUPDATE;-- 加排他锁UPDATEproductsSETstockstock-1WHEREid1;COMMIT;3. 按锁粒度分类锁粒度支持引擎特点性能表锁MyISAM、InnoDBDDL/意向锁锁定整表简单但并发差低页锁BDB已废弃锁定数据页介于表锁和行锁之间中行锁InnoDB锁定索引记录并发高高InnoDB表锁场景DDL操作如ALTER TABLE会加表锁事务执行LOCK TABLES ... WRITE显式加表锁意向锁IS/IX是表级锁用于快速判断表锁兼容性4. InnoDB 行锁的四种类型核心4.1 记录锁Record Lock定义锁定索引记录不是行本身防止其他事务修改或删除该记录加锁对象索引项没有索引时自动使用隐藏聚簇索引SQL示例SELECT*FROMusersWHEREid1FORUPDATE;-- 锁定id1的索引记录4.2 间隙锁Gap Lock定义锁定索引记录之间的间隙开区间不包括记录本身作用防止其他事务在间隙中插入新记录避免幻读生效条件RR隔离级别及以上SQL示例-- 假设id值1, 3, 5, 7, 9SELECT*FROMusersWHEREidBETWEEN3AND5FORUPDATE;-- 锁定间隙(1,3)、(3,5)、(5,7)4.3 Next-Key Lock定义Record Lock Gap Lock锁定一个左开右闭的区间计算公式Next-Key Lock (前一个值, 当前值] 的间隙锁 当前值的记录锁作用InnoDB在RR级别下的默认行锁算法同时防止幻读和保证当前读一致性SQL示例-- 假设id值1, 3, 5, 7, 9SELECT*FROMusersWHEREid5FORUPDATE;-- Next-Key Lock锁定范围(3,5] 和 (5,7]-- 即锁住id5的记录以及(3,5)和(5,7)的间隙4.4 插入意向锁Insert Intention Lock定义一种特殊的间隙锁表示事务意图在某个间隙中插入数据特性多个事务可以同时在同一间隙中持有插入意向锁只要插入的位置不冲突不同索引值作用提高插入并发性避免间隙锁完全阻塞所有插入-- 事务A锁定间隙(3,5)SELECT*FROMusersWHEREid4FORUPDATE;-- 加间隙锁(3,5)-- 事务B在间隙(3,5)中插入id4.5INSERTINTOusersVALUES(4.5,xxx);-- 阻塞与间隙锁冲突-- 事务C在间隙(3,5)中插入id4.8INSERTINTOusersVALUES(4.8,xxx);-- 也阻塞间隙锁阻塞所有插入5. 行锁的加锁规则与退化唯一索引等值查询条件加锁类型示例id主键1,3,5,7,9命中Record LockWHERE id5→ 锁5Next-Key锁退化未命中Gap LockWHERE id4→ 锁(3,5)间隙普通索引等值查询条件加锁类型示例age普通索引1,3,5,7,9命中Next-Key LockWHERE age5→ 锁(3,5]和(5,7)未命中Gap LockWHERE age4→ 锁(3,5)间隙范围查询-- 唯一索引范围SELECT*FROMusersWHEREid5FORUPDATE;-- 锁所有id5的Record Lock 后续Gap Lock到无穷大-- 普通索引范围SELECT*FROMusersWHEREage5FORUPDATE;-- 锁所有age5的Next-Key Lock6. 意向锁Intention Lock详解6.1 什么是意向锁意向锁是表级锁表示事务意图对表中的某些行加锁。锁类型含义加锁时机意向共享锁IS事务意图对某些行加共享锁S锁SELECT ... LOCK IN SHARE MODE意向排他锁IX事务意图对某些行加排他锁X锁SELECT ... FOR UPDATE、UPDATE、DELETE6.2 意向锁的作用避免表锁与行锁的冲突检测遍历事务A要对整表加LOCK TABLES ... WRITE表级X锁如果没有意向锁需要遍历所有行检查是否有行锁 → O(n)复杂度有意向锁时只需检查表上的意向锁 → O(1)复杂度6.3 意向锁兼容性矩阵锁类型ISIXS表级X表级IS✅✅✅❌IX✅✅❌❌S表级✅❌✅❌X表级❌❌❌❌关键规律意向锁之间相互兼容IS与IS、IS与IX、IX与IX都兼容意向锁与表级共享锁S部分兼容IS兼容IX不兼容意向锁与表级排他锁X不兼容7. 行锁与隔离级别的关系隔离级别是否使用Gap Lock幻读风险说明READ UNCOMMITTED❌有几乎不加锁READ COMMITTED❌有只有Record Lock无Gap LockREPEATABLE READ✅无InnoDB默认使用Next-Key LockSERIALIZABLE✅无所有SELECT隐式加锁RC vs RR的行锁差异-- RC级别只有Record Lock-- RR级别Next-Key LockRecord Lock Gap Lock-- 示例假设id值1, 3, 5, 7, 9SELECT*FROMusersWHEREid5FORUPDATE;-- RC级别只锁id5的记录其他事务可插入4、6-- RR级别锁(3,5]和(5,7)其他事务不可插入4、68. 行锁的实现原理源码层面8.1 行锁加在索引上InnoDB的行锁本质是索引项锁通过主键索引查询 → 锁聚簇索引记录通过二级索引查询 → 先锁二级索引记录再锁聚簇索引记录为什么必须是索引行锁通过索引定位记录没有索引条件时InnoDB会锁全表所有聚簇索引记录8.2 两阶段锁协议2PL加锁阶段事务开始到提交前可以随时加锁解锁阶段事务提交或回滚时统一释放所有锁无中途解锁InnoDB不支持UNLOCK操作8.3 锁的内存结构每个锁在内存中对应一个lock_t结构包含trx_id持有锁的事务IDtype_mode锁类型S/X/IS/IX/GAP等index锁定的索引bitmap行记录位图一个锁可锁定多条记录9. 死锁检测与处理9.1 死锁产生条件四个必要条件互斥、持有并等待、不可剥夺、循环等待。9.2 典型死锁场景-- 事务ASTARTTRANSACTION;UPDATEusersSETnameAWHEREid1;-- 锁id1UPDATEusersSETnameAWHEREid2;-- 等待事务B释放id2-- 事务BSTARTTRANSACTION;UPDATEusersSETnameBWHEREid2;-- 锁id2UPDATEusersSETnameBWHEREid1;-- 等待事务A释放id1-- 死锁形成9.3 InnoDB死锁处理机制死锁检测维护事务等待图trx_t和lock_t检测到循环等待时立即处理死锁回滚回滚代价较小的事务修改行数少的参数控制innodb_deadlock_detectON默认开启innodb_lock_wait_timeout50死锁检测超时默认50秒查看死锁信息SHOWENGINEINNODBSTATUS;-- 查看最近死锁SELECT*FROMinformation_schema.INNODB_TRX;-- 查看当前事务SELECT*FROMinformation_schema.INNODB_LOCKS;-- 查看当前锁10. 总结对比表锁类型粒度作用是否阻塞插入RR级别默认Record Lock行索引记录锁定单条记录否✅Gap Lock间隙锁定索引间隙防幻读✅✅Next-Key Lock行间隙锁定记录及前间隙✅✅默认Insert Intention Lock间隙表示意图插入特殊位置不冲突时兼容✅意向锁IS/IX表协调表锁与行锁否✅面试官想要的满分总结InnoDB的锁体系从三个维度理解一、按加锁思想乐观锁版本号/CAS应用层实现和悲观锁数据库行锁/表锁。二、按锁粒度表锁MyISAM/DDL、行锁InnoDB核心、页锁已废弃BDB。三、InnoDB行锁四种类型Record Lock锁定索引记录行锁的基础Gap Lock锁定索引间隙防幻读RR级别生效Next-Key LockRecord Lock Gap LockRR级别默认算法Insert Intention Lock特殊的间隙锁提高插入并发性**意向锁IS/IX**是表级锁用于快速判断表锁兼容性避免遍历所有行检查行锁。实现原理行锁实质是索引项锁通过索引定位记录遵循两阶段锁协议2PL事务结束时统一释放锁死锁检测通过等待图实现回滚代价较小的事务一句话InnoDB行锁 基于索引的记录锁 RR级别下的间隙锁防幻读通过意向锁快速协调表锁与行锁通过死锁检测自动处理循环等待。觉得对您有帮助麻烦点点关注啦您的关注是我创作的最大动力~