数据库基础知识---MySQL间隙锁(Gap Lock)

本文详细介绍了MySQL InnoDB存储引擎中的间隙锁(Gap Lock)概念,它在范围查询时对不存在的记录加锁,防止幻读现象。同时,间隙锁能避免数据误删或修改,但在高并发插入场景下可能影响性能。通过案例展示了间隙锁如何工作及其在事务中的应用。
摘要由CSDN通过智能技术生成

MySQL InnoDB支持三种行锁定方式:

  1. 行锁(Record Lock):锁直接加在索引记录上面。
  2. 间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。
  3. Next-Key Lock:行锁与间隙锁组合起来用就叫做Next-Key Lock。

一. 间隙锁的概念

  1. 当我们用范围条件(between)而不是相等条件(=)检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;
  2. 对于键值在条件范围内但不存在的记录,叫做 “间隙(GAP)”,InnoDB也会对这个"间隙"加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。

二. 间隙锁的产生

1. 创建测试表

CREATE TABLE `test`.`Untitled`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sex` int(255) NOT NULL,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `name`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

在这里插入图片描述

2. 进行sql语句查询

select id,name from t_student where id > 0 and id < 5 for update;

在这里插入图片描述

  1. select ... for update这条语句,是会对数据记录加锁的,这里因为命中了索引,加的是行锁。从数据记录来看,这里排它锁锁住数据是id为1、3和4的这3条数据。

  2. 但是,看看前面我们的介绍——对于键值在条件范围内但不存在的记录,叫做"间隙(GAP)",InnoDB也会对这个"间隙"加锁。

  3. id=2的记录insert进来了,一直保持等待(会出现超时等待问题),要等到这个事务结束以后才会执行的,
    在这里插入图片描述

三. 间隙锁的作用

①. 防止幻读

时间事务A事务B
T0BEGIN;BEGIN;
T1select count(1) from t_student where id > 1;
T2insert into t_student VALUES(2,‘戏子111’,1,“杭州”);
T3commit;
T4select count(1) from t_student where id > 1;
T5commit;

事务A进行操作

在这里插入图片描述

事务B进行操作

在这里插入图片描述

事务A再进行操作

在这里插入图片描述

  • 如果没有间隙锁,事务A在T1和T4读到的结果是不一样的,有了间隙锁,读的就是一样的了,解决了幻读的问题。

②. 防止数据误删/改

时间事务A事务B
T0BEGIN;BEGIN;
T1delete from t_student where id < 4;
T2insert into t_student VALUES(2,‘戏子111’,1,“杭州”);
T3commit;
T4commit;
  • 这种情况下,如果没有间隙锁,会出现的问题是:id为2的记录,刚加进去,就被删除了,这种情况有时候对业务,是致命性的打击。加了间隙锁之后,由于insert语句要等待事务A执行完之后释放锁,避免了这种情况

三.使用间隙锁的隐患

  1. 事务A锁住了需要插入数据的区域,一直在进行数据处理,导致插入数据一直在等待,对插入的性能就有很大影响了,必须等到事务结束才能进行插入,性能会降低。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值