mysql-Innodb锁相关内容

1、InnoDB存储引擎包含的锁类型

  • 共享锁(S锁)和排他锁(X锁)
  • 意向锁
  • 记录锁
  • 间隙锁
  • Next-key锁
  • 插入意向锁
  • Auto-INC 锁
  • 空间索引的谓词锁

2、共享锁(S锁)和排他锁(X锁)-- 锁定数据行

共享锁(S锁)和排他锁(X锁),均为**行级别锁定**。
  • 共享锁:允许持有锁的事务读取某一行;
  • 排他锁:允许持有锁的事务更新或者删除一行;

3、意向锁 – 锁定数据表

1) InnoDB 支持多粒度的锁定,允许行锁表锁共存。为了实现多粒度锁定,使用了意向锁。

2)意向锁是表级锁,指示事务稍后需要对表中的行使用哪种类型的锁(共享S锁或者排他X锁)。

3)意向锁的分类

  • 意向共享锁(IS锁):IS 表示事务打算在表中的个别行上设置 S 锁;

  • 意向排他锁(IX锁):IX 表示事务打算在表中的个别行上设置 X 锁;

    例如:SELECT … FOR SHARE设置一个IS锁, SELECT … FOR UPDATE设置一个IX锁。

4)在事务可以获得表中某一行上的共享锁之前,它必须首先获得 IS 表级锁
在事务可以获得表中某一行上的排他锁之前,它必须首先获得 IX 表级锁

5)表级锁类型兼容如下
在这里插入图片描述

  • 如果请求的事务与现有锁兼容,则授予该锁;
  • 如果请求的事务与现有锁冲突,当前事务将等待,直到冲突的锁被释放。同时,锁请求与现有锁出现冲突,导致死锁而无法授权;

4、记录锁 – 锁定索引

记录锁是对索引记录的锁定。

例如:SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 阻止任何其他事务插入、更新或删除值为 的 t.c1行 10

5、间隙锁 – 锁定数据间隙

间隙锁是锁定索引记录之前的间隙,也可以锁定当前索引记录之前或者之后的间隙。

例如1:SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;  该语句将会在 10~20的范围内添加间隙锁,
阻止新的数据插入到间隙中。

例如2:SELECT * FROM child WHERE id = 100;
分析a:如果列 id 具有唯一索引,则仅仅会添加索引记录锁,仅锁定当前数据行;
分析b:如果列 id 没有索引或者具有非唯一索引,则会添加间隙锁,锁定数据行前面的间隙;

6、Next-key锁 = 记录锁 + 间隙锁(两者的组合)

Next-key锁 = 索引记录锁 + 索引记录前面间隙上的间隙锁。使用 Next-key锁进行搜索和索引扫描,
可以防止出现幻读数据。

7、插入意向锁(目的是提前锁定数据插入的间隙)

当执行 insert 操作的时候,当前事务会获取插入意向锁(特殊的间隙锁),同时等待获取独占 X 锁。

8、AUTO-INC锁【表级锁】

当数据主键列使用 AUTO_INCREMENT ,在执行  insert 操作的时候,系统会申请获取 **AUTO-INC 表级锁**。在最简单
的情况下,如果一个事务正向表中插入值,则任何其他事务都必须等待才能执行自己的操作,以便第一个事务插入的行能
够接收连续的主键值。

关注:innodb_autoinc_lock_mode 变量控制用于自动增量锁定的算法

9 、空间索引的谓词锁

为了支持带空间索引的表的隔离级别,InnDB 使用谓词锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小达人Fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值