1全局锁
全局锁主要应⽤于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新, ⽽出现备份⽂件的数据与预期的不⼀样,加上全局锁,意味着整个数据库都是只读状态。
2. 表级锁 ● ● ●
元数据锁(MDL):对数据库表进⾏操作时,会⾃动给这个表加上元数据锁,为了保证当 ⽤户对表执⾏ CRUD 操作时,其他线程对这个表结构做了变更。元数据锁在事务提交后才 会释放。
意向锁:对某些记录加上共享锁之前,需要先在表级别加上⼀个意向共享锁,对某些纪录 加上独占锁之前,需要先在表级别加上⼀个意向独占锁。普通的 select 是不会加⾏级锁 的,普通的 select 语句是利⽤ MVCC 实现⼀致性读,是⽆锁的。
AUTO-INC 锁:表⾥的主键通常都会设置成⾃增的,之后可以在插⼊数据时,可以不指定 主键的值,数据库会⾃动给主键赋值递增的值通过 AUTO-INC 锁实现的。在插⼊数据 时,会加⼀个表级别的 AUTO-INC 锁,然后为被 AUTO_INCREMENT 修饰的字段赋值递 增的值,等插⼊语句执⾏完成后,才会把 AUTO-INC 锁释放掉。其他事务的如果要向该表 插⼊语句都会被阻塞,从⽽保证插⼊数据时字段的值是连续递增的。
3. ⾏锁 ● ● ● ●
记录锁:锁住的是⼀条记录,记录锁分为排他锁和共享锁。
间隙锁:只存在于可重复读隔离级别,⽬的是为了解决可重复读隔离级别下幻读的现象。 间隙锁之间是兼容的,两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥 关系。
Next-Key Lock:Next-Key Lock临键锁,是 Record Lock + Gap Lock 的组合,锁定⼀ 个范围,并且锁定记录本身。next-key lock 即能保护该记录,⼜能阻⽌其他事务将新纪录 插⼊到被保护记录前⾯的间隙中。
插⼊意向锁:⼀个事务在插⼊⼀条记录的时候,需要判断插⼊位置是否已被其他事务加了 间隙锁(next-key lock 也包含间隙锁)。如果有的话,插⼊操作就会发⽣阻塞,直到拥有 间隙锁的那个事务提交为⽌,在此期间会⽣成⼀个插⼊意向锁,表明有事务想在某个区间 插⼊新记录,但是现在处于等待状态。