2026-04-08 13:56:11
MySQL中鲜为人知的锁包括全局锁、意向锁、自增锁,以下是对这些锁的详细介绍:
全局锁DML语句中的insert、update、delete操作。
所有DDL语句。
更新类事务的提交语句。
对主库使用全局锁备份会导致业务停滞。
对从库使用全局锁备份会导致主从延迟。
事务A在行上加独占锁时,数据库会自动给事务A加上该表的意向独占锁。
事务B尝试加表锁时,通过检查意向锁判断表中是否有行被锁定。
事务A执行update product set quantity = quantity -1 where id = 10,在id=10的行上加独占锁,并自动加表的意向独占锁。
事务B执行update product set quantity = quantity +10,尝试加表锁时,通过检查意向锁判断表中是否有行被锁定。

事务获取自增锁后,执行插入操作并确保自增值的唯一性和连续性(是否连续取决于参数设置)。
自增锁在SQL语句执行完成后立即释放,而非事务完成后释放,以提高性能。
从MySQL 5.1.22开始,使用轻量级的内存mutex锁替代传统表锁,通过估算插入数量减少锁竞争。
提供innodb_autoinc_lock_mode参数控制自增模式,支持三种模式:
0(Traditional):所有插入语句获取表级自增锁,语句结束后释放,保证自增值连续。
1(Consecutive):简单插入和混合插入使用mutex锁,批量插入使用表锁,平衡性能与连续性。
2(Interleaved):所有插入语句不使用表锁,高并发下性能最佳,但自增值可能不连续。
事务回滚会导致自增值丢失,产生空洞。
批量插入(Bulk inserts)在模式0或1下自增值连续,模式2下可能因预分配过多ID产生空洞。
混合插入(Mixed-mode inserts)在模式1或2下可能因分配未使用的ID产生空洞。
简单插入:insert into values (1, 'a')。
批量插入:insert ... select。
混合插入:INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d')。
总结:全局锁、意向锁和自增锁是MySQL中相对鲜为人知但重要的锁机制。全局锁用于全库备份,意向锁优化表锁加锁效率,自增锁确保自增主键的唯一性和连续性(受参数控制)。理解这些锁的工作原理和适用场景,有助于优化数据库性能和避免并发问题。