MySQL 锁分类

71 阅读2分钟
分类维度​​锁类型​​**​描述​示例/语法​
​按粒度​​全局锁​锁定整个数据库实例,用于备份等操作FLUSH TABLES WITH READ LOCK
​表级锁​锁定整张表LOCK TABLES ... READ/WRITE
​元数据锁(MDL)​防止表结构变更(DDL)与查询(DML)冲突自动加锁(如ALTER TABLE时)
​意向锁(IS/IX)​表示事务稍后可能对表中的某些行加共享锁(S)或排他锁(X)SELECT ... FOR SHARE(IS)
​行级锁​锁定单行或索引记录SELECT ... FOR UPDATE(X锁)
​按操作类型​​共享锁(S锁/读锁)​允许其他事务读,但不允许修改SELECT ... LOCK IN SHARE MODE
​排他锁(X锁/写锁)​禁止其他事务读或修改SELECT ... FOR UPDATE
​按性能​​悲观锁​默认方式,先加锁再操作SELECT ... FOR UPDATE
​乐观锁​无锁机制,通过版本号控制应用层实现(如version字段)
​行锁细分​​记录锁(Record Lock)​锁定索引记录(主键或唯一索引)自动加锁(如UPDATE某行)
​间隙锁(Gap Lock)​锁定索引记录之间的间隙,防止幻读自动加锁(RR隔离级别下)
​临键锁(Next-Key Lock)​记录锁+间隙锁,锁定记录及前面的间隙默认行锁方式(RR隔离级别)
​插入意向锁​特殊的间隙锁,允许不同事务在相同间隙插入不同数据自动加锁(INSERT时)

使用行锁的注意事项:

  1. 行锁主要加载索引上,如果对非索引的字段设置条件进行更新,行锁可能会变成表锁
  2. InnoDB的行锁是针对索引加锁,不是针对记录加锁,并且加锁的索引不能失效,否则行锁可能会变成表锁
  3. 锁定某一行时,可以使用lock in share mode命令来指定共享锁,使用for update命令来指定排它锁