目录
1.锁的概述
1.锁的作用:
锁是为了保证数据并发访问一致性
2.锁的分类:
按照锁的粒度分
* 全局锁:锁定数据库的所有表
* 表级锁:每次操作锁定整张表
* 行级锁:每次操作锁住对应行数据
2.全局锁
* 加锁后,数据库处于只读状态,其他操作语句将被阻塞
* 应用场景:全库的逻辑备份
* 备份:将数据库的sql文件备份到磁盘中
3.表级锁
1.表级锁的概述:
锁定粒度大,发生锁冲突的概率最高,并发度最低
2.表级锁分类:
* 表锁
* 元数据锁:meta data lock,MDL
* 意向锁
2.1表锁:
分为两类
* 表共享读锁:read lock
* 表独占写锁:write lock
2.2元数据锁:
系统自动控制,无需显式使用,访问表时自动加上
* 作用:维护表元数据的一致性
* 表有活动事务时,无法对元数据进行写入操作
* 比如在数据写增删改查时,加MDL读共享锁;对表结构进行变更时,加上MDL写锁
2.3意向锁
* 作用:为了避免表的增删改查操作中、行锁与表锁的冲突
* 功能:表锁不需要检查每行数据是否加锁,使用意向锁减少表锁的检查
* 实现:加表锁之前先检查意向锁,若表锁与意向锁不兼容则直接阻塞,等到行锁接触后再加表锁
* 分类:
* 意向共享锁:和读锁兼容,和写锁互斥
* 意向排他锁;和读锁和写锁都互斥
4.行级锁
1.行级锁的概述:
锁定粒度最小,发生锁冲突的概率最低,并发度最高,主要应用于InnoDB中
* InnoDB数据是基于索引的,行锁是通过索引上的索引项加锁实现的,并不是对行纪录加锁
2.行级锁的分类
* 行锁:Record Lock锁定单行记录的锁
* 间隙锁:Gap Lock锁定索引记录的间隙(不包含该记录),确保该间隙不变,防止其他事务对该间隙进行insert产生幻读
* 临键锁:Next-Key Lock行锁和间隙锁的组合
2.1行锁:
* 分为共享锁和排他锁
* 共享锁:允许一个事务读一行,组织其他事务获得相同数据集的排他锁;即共享锁之间兼容,共享锁与排他锁互斥
* 排他锁:允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁;
* 增删改:排他锁
* select:不加任何锁
* 行锁在默认事务隔离级别运行,使用next-key锁进行搜索和扫描,从而防止幻读
* 针对唯一索引进行检索时自动优化为行锁
* InnoDB是针对索引加的锁,不通过索引条件检索数据,则InnoDB将对表的所有记录加锁,此时升级为表锁
2.2间隙锁和临键锁
* 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
* 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock自动退化为间隙锁
* 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止
* 注意:间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙采用间隙锁