头图

在这里插入图片描述

大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈

前言

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 )。表示事务准备获取数据行的排他锁,即获取数据行的排他锁前必须先获得该表的意向排他锁。

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

四. 行锁锁住的是什么

行锁锁住的是 主键索引

如果 没有使用索引,此时会全表扫描,并把每一个主键索引锁住,造成锁全表的现象。

五. 记录锁

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

在这里插入图片描述

六. 间隙锁

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

在这里插入图片描述

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

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

七. 临键锁

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

在这里插入图片描述

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

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

八. 事务隔离级别的实现

如下表所示。

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

大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈

在这里插入图片描述


半夏之沫
76 声望34 粉丝