MySQL 锁
MySQL 锁 面试 About 1,638 words锁的分类
按锁的粒度来分:
- 全局锁:锁定数据库中的所有表
- 表级锁:每次操作锁住整张表
- 行级锁:每次操作锁住对应的行数据
全局锁
可读不可写。
使用场景
全局备份。
mysqldump -h127.0.0.1 -uroot -p testdb > testdb.sql
通过快照读实现不加锁备份
mysqldump --single-transaction -uroot -p testdb > testdb.sql
上锁
flush tables with read lock;
解锁
unlock tables;
表级锁
表共享读锁 read lock
所有连接都可读。
当前连接不可执行写操作,其他连接写操作将阻塞。
上锁
lock tables testdb read;
解锁
unlock tables;
表独占写锁 write lock
当前连接即可读也可写。
其他连接读写都将阻塞。
上锁
lock tables testdb write;
解锁
unlock tables;
元数据锁 metadata lock(MDL)
在MySQL5.5
中引入了元数据锁,当对一张表进行增删改查的时候,加MDL
共享读锁;当对表结构进行变更操作的时候,加MDL
排它写锁。
有活动的事务时,不可以对表结构进行修改。
select object_type, object_schema, object_name, lock_type, lock_duration from performance_schema.metadata_locks;
意向锁
为了避免DML
在执行时,加的行数与表锁的冲突,在InnoDB
中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
意向共享锁(IS):由select...lock in share mode
添加。与表锁共享锁(read
)兼容,与表锁排它锁(write
)互斥。
意向排它锁(IX):由insert
、update
、delete
、select...for update
添加。与表锁共享锁(read
)及表锁排它锁(write
)都互斥。
意向锁之间不会互斥。
MySQL8
可使用以后SQL
查询
select object_schema, object_name, index_name, lock_type, lock_mode, lock_data from performance_schema.data_locks;
行级锁
行锁(Record Lock)
也叫记录锁。
锁定单个行记录的锁,防止其他事务对此进行update
和delete
。在RC
、RR
隔离级别下都支持。
共享锁(S)
允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
select...lock in share mode
排它锁(X)
允许获取排它锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排它锁。
insert
、update
、delete
自动加排它锁。
select...for update
间隙锁(Gap Lock)
锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个 间隙进行insert
(update
语句不受影响),产生幻读。在RR
隔离级别下都支持。
- 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
- 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,
Next-Key Lock
退化为间隙锁。 - 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止。
间隙锁最主要是防止幻读。间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。
临键锁(Next-Key Lock)
行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap
。在RR
隔离级别下支持。
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓