likes
comments
collection
share

五分钟速览MySQL的锁

作者站长头像
站长
· 阅读数 56

五分钟速览MySQL的锁


前言

MySQL的锁是一个老生常谈的东西了,最近由于不让使用Redis,但是又必须要使用分布式锁,所以就基于MySQL实现了一个分布式锁,正好就回顾了一下MySQL里面的锁知识,做一个总结,与君共勉

正文

一. 共享锁

共享锁是行锁,又称为读锁,简称S锁。共享锁有如下特点。

  1. 数据行允许多个事务获取共享锁;
  2. 获取共享锁后,只能读取数据,不能修改数据。

共享锁的加锁方式如下。

SELECT * FROM test_table WHERE id=1 LOCK IN SHARE MODE;

共享锁的释放方式如下。

COMMIT/ROLLBACK;

二. 排他锁

排他锁是行锁,又称为写锁,简称X锁。排他锁有如下特点。

  1. 数据行只允许一个事务获取排他锁;
  2. 数据行被某个事务获取排他锁后,其它事务不能再获取该数据行的共享锁和排他锁;
  3. 数据行只能被获取了该数据行排他锁的事务读取和修改。

排他锁的加锁方式如下。

# 自动加锁
DELETE/UPDATE/INSERT语句会默认加上排他锁

# 手动加锁
SELECT * FROM test_table WHERE id=1 FOR UPDATE;

排他锁的释放方式如下。

COMMIT/ROLLBACK;

三. 意向锁

意向锁是由数据库引擎自己维护用户无法手动操作表锁。意向锁分为如下两种。

  1. 意向共享锁Intention Shared Lock简称IS)。表示事务准备获取数据行的共享锁,即获取数据行的共享锁前必须先获得该表的意向共享锁;
  2. 意向排他锁Intention Exclusive Lock简称IX)。表示事务准备获取数据行的排他锁,即获取数据行的排他锁前必须先获得该表的意向排他锁。

使用意向锁的作用就是当需要获取表的表锁时,前提就是没有其它事务获取了数据行的行锁,而全表扫描来判断是否有行锁的效率,是低于判断意向锁是否被获取的

四. 行锁锁住的是什么

行锁锁住的是 主键索引

如下两种情况会造成锁全表

  1. 没有使用索引。此时会全表扫描,并把每一个主键索引锁住,造成锁全表的现象;
  2. 使用辅助索引。由于辅助索引最终也会关联到主键索引,此时也会造成锁全表的现象。

五. 记录锁

记录锁(Record Lock),进行唯一性索引(主键/唯一)等值查询并精确匹配时会使用到。如下图所示。

五分钟速览MySQL的锁

六. 间隙锁

间隙锁(Gap Lock),当查询的记录不存在时会使用到。如下图所示。

五分钟速览MySQL的锁

关于间隙锁,有如下说明。

  1. 间隙锁之间并不冲突,但间隙锁会阻塞插入
  2. 假如记录数为N,那么间隙锁的数量为N+1
  3. 使用间隙锁,是为了在当前读的情况下解决幻读的问题。

七. 临键锁

临键锁(Next-Key Lock),当范围查询并且包含记录和区间时会使用到。如下图所示。

五分钟速览MySQL的锁

关于临键锁,有如下说明。

  1. 临键锁可以理解为记录锁 + 间隙锁
  2. 假如记录数为N,那么间隙锁的数量为N+1
  3. 使用临键锁,是为了在当前读的情况下解决幻读的问题。

八. 事务隔离级别的实现

如下表所示。

RR(可重复读)RC(读已提交)
SELECT快照读MVCCMVCC
SELECT ... IN SHARE MODE当前读SELECT ... FOR UPDATE当前读INSERTUPDATEDELETERecord Lock记录锁Gap Lock间隙锁Next-Key Lock临键锁Record Lock记录锁

总结不易,如果本文对你有帮助,烦请点赞,收藏加关注,谢谢帅气漂亮的你。

五分钟速览MySQL的锁

转载自:https://juejin.cn/post/7376113820233367591
评论
请登录