Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 算法 小程序 Arthas JVM juc AQS Docker DevOps


MySQL 锁

MySQL 面试 大约 1638 字

锁的分类

按锁的粒度来分:

  • 全局锁:锁定数据库中的所有表
  • 表级锁:每次操作锁住整张表
  • 行级锁:每次操作锁住对应的行数据

全局锁

可读不可写。

使用场景

全局备份。

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):由insertupdatedeleteselect...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)

也叫记录锁。

锁定单个行记录的锁,防止其他事务对此进行updatedelete。在RCRR隔离级别下都支持。

共享锁(S)

允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。

select...lock in share mode

排它锁(X)

允许获取排它锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排它锁。

insertupdatedelete自动加排它锁。

select...for update

间隙锁(Gap Lock)

锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个 间隙进行insertupdate语句不受影响),产生幻读。在RR隔离级别下都支持。

  1. 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
  2. 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,Next-Key Lock退化为间隙锁。
  3. 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止。

间隙锁最主要是防止幻读。间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

临键锁(Next-Key Lock)

行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

阅读 54 · 发布于 2022-05-08

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批