MySQL的间隙锁

阅读文本大概须要3分钟。java

0x01:什么是间隙锁mysql

        间隙锁(Gap Lock)是Innodb在可重复读提交下为了解决幻读问题时引入的锁机制。当用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫作“间隙(GAP)”,InnoDB也会对这些“间隙”进行加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。程序员


0x02:间隙锁引发的问题web

       由于执行SELECT语句中,若是经过范围查找的话,间隙锁会锁定整个范围内全部的索引键值,即便这个键值并不存在。这个就是间隙锁最致命的缺点,就是当锁定一个范围键值以后,即便某些不存在的键值也会被无辜的锁定,而形成在锁定的时候没法插入锁定值范围内的任何数据,在某些场景下这可能会针对性形成很大的危害。sql


0x03:间隙锁例子
微信

建表:
session

CREATE TABLE `gas_lock_tab` (
`id`  bigint(20NOT NULL COMMENT 'id' ,
`user_name_py`  int(11NOT NULL COMMENT '用户姓名拼音' ,
PRIMARY KEY (`id`),
INDEX `usernameIndex` (`user_name_py`USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
ROW_FORMAT=DYNAMIC
;

插入数据:架构

INSERT INTO `gas_lock_tab`(`id``user_name_py`VALUES (1'huangjinjin');
INSERT INTO `gas_lock_tab`(`id``user_name_py`VALUES (3'java乐园');
INSERT INTO `gas_lock_tab`(`id``user_name_py`VALUES (5'架构师知音');
INSERT INTO `gas_lock_tab`(`id``user_name_py`VALUES (8'java狂人');   

插入数据后查询:
app

mysql> select * from gas_lock_tab;
+----+--------------+
| id | user_name_py |
+----+--------------+
|
  1 | huangjinjin  |
|  3 | java乐园     |
|
  8 | java狂人     |
|  5 | 架构师知音    |
+----+--------------+
4 rows in set  

      注意表中的数据,id字段是int型,包含1,3,5,8;固然1到8中间,缺乏连续的id:2,4,6,7,而没有连续下来。通常在表里的主键id最好是连续的,方便索引;所谓的删除实际上是作逻辑删除,只是作了状态更改,而不作物理删除。编辑器


打开两个Mysql终端,分别设置autocommit为0(手动提交事务),也就是关闭自动提交功能,事务隔离级别处于可重复读状态。

session 1:

mysql> set autocommit=0;
Query OK, 0 rows affected


session 2:

mysql> set autocommit=0;
Query OK, 0 rows affected



session 1 执行update操做,执行成功

mysql> update gas_lock_tab set user_name_py = '1234' where id > 1 and id < 5;
Query OK, 0 rows affected
Rows matched: 1  Changed: 0  Warnings: 0

也就是对3这四条数据作修改。注意这里没有id为2和4的记录;在第二个终端执行insert操做,发现被阻塞。

insert into gas_lock_tab values (2,'it大佬');


按说在InnoDB的行级锁,两个不一样的终端操做不一样的行数据,不会形成阻塞,可是阻塞出现了。达到超时时间后,seesion 2出现以下错误:

另外,若是在session 2的插入语句没有超时以前,对session 1进行 commit操做,则会发现session 2也会执行操做成功。

session 1 commit操做:

session 2出现的结果:

这时对session 1作commit操做,发现update和inster操做都生效了。





往期精彩



01 漫谈发版哪些事,好课程推荐

02 Linux的经常使用最危险的命令

03 精讲Spring&nbsp;Boot—入门+进阶+实例

04 优秀的Java程序员必须了解的GC哪些

05 互联网支付系统总体架构详解

关注我

天天进步一点点

喜欢!在看☟

本文分享自微信公众号 - JAVA乐园(happyhuangjinjin88)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索