MySQL锁总结
全局锁
flush tables with read lock
和unlock tables
主要用于数据库备份,整个数据库处于只读状态
如果支持MVCC,那么可以用可重复读隔离级别进行数据库备份, mysqldump 时加上 –single-transaction
参数
表级锁
表锁
lock tables t_student read/write;
和unlock tables
元数据锁MDL
对表CRUD,加MDL读锁
对表做变更,加MDL写锁
事务执行期间,MDL 是一直持有的,写锁获取优先级高于读锁
意向锁
- 加上共享锁之前,需要先在表级别加上一个意向共享锁
- 加上独占锁之前,需要先在表级别加上一个意向独占锁
意向共享锁和意向独占锁是表级锁,不会和行级的共享锁和独占锁发生冲突,而且意向锁之间也不会发生冲突,只会和共享表锁(lock tables ... read)和独占表锁(lock tables ... write)发生冲突。
如果没有「意向锁」,那么加「独占表锁」时,就需要遍历表里所有记录,查看是否有记录存在独占锁,这样效率会很慢。
意向锁的目的是为了快速判断表里是否有记录被加锁。
AUTO-INC 锁
数据库会自动给主键赋值递增的值,这主要是通过 AUTO-INC 锁实现的。插入语句后就会立即释放。
行级锁
InnoDB 引擎是支持行级锁的
共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互 斥、读写互斥。
记录锁
Record Lock,记录锁,也就是仅仅把一条记录锁上;分 S 锁(读搜)和 X 锁(写锁)
间隙锁
Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身,只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象。间隙锁之间是兼容的
临键锁
Next-Key Lock:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身
插入意向锁
一个事务在插入一条记录的时候,需要判断插入位置是否已被其他事务加了间隙锁(next-key lock 也包含间隙锁)。如果有的话,插入操作就会发生阻塞,直到拥有间隙锁的那个事务提交为止(释放间隙锁的时刻),在此期间会生成一个插入意向锁,表明有事务想在某个区间插入新记录,但是现在处于等待状态。