MySQL锁机制

2020-07-07  本文已影响0人  策马踏清风

锁分类

按照粒度可以分为表级锁table-level locking和行级锁row-level locking

InnoDB默认采用行级锁MyISAMMEMORY默认采用表级锁

行锁

InnoDB实现类两种类型的行锁

锁类型 共享锁S 排他锁X
共享锁S 兼容 冲突
排他锁X 冲突 冲突

手动添加行锁

默认情况下锁都是自动获取的,但也可以手动加锁。

意向锁

为了兼容表级锁和行级锁,InnoDB采用了意向锁(属于表级锁)。意向锁为自动添加,也可以手动LOCK TABLE添加

锁类型 共享锁S 排他锁X 意向共享锁IS 意向排他锁
共享锁S 兼容 冲突 兼容 冲突
排他锁X 冲突 冲突 冲突 冲突
意向共享锁IS 兼容 冲突 兼容 兼容
意向排他锁IX 冲突 冲突 兼容 兼容

意向锁只是标记当前有事务在操作行级锁,意向锁意向锁之间并不会冲突

手动添加意向锁

行锁实现

  1. 记录锁Record Lock:通过索引值进行加锁

  2. 间隙锁Gap LockBETWEEN 1 and 10这样的语句会产生多行记录的锁,此时就是间隙锁。代表一段区域,可以是两个索引之间、某个索引之前、某个索引之后。

  3. Next-key锁:该锁可以锁住当前位置和之前的区域,即记录锁+间隙锁。主要用于解决幻读,使用for update时通过加Next-key解决幻读。普通情况下采用MVCC解决幻读

可以使用SHOW ENGINE INNODB STATUS命令查看InnoDB监控中关于锁的事务数据
记录锁永远都是锁定索引记录,优先聚集索引,没有定义索引InnoDB会自动创建隐藏的聚集索引。

上一篇 下一篇

猜你喜欢

热点阅读