前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >innodb锁机制探究(二)---间隙锁(2)

innodb锁机制探究(二)---间隙锁(2)

作者头像
AsiaYe
发布2019-11-06 17:15:33
5560
发布2019-11-06 17:15:33
举报
文章被收录于专栏:DBA随笔DBA随笔

innodb锁机制探究(二)---间隙锁(2)

上一篇文章中,我们已经知道innodb中的间隙锁是对普通索引记录的间隙做的一个锁定动作,这篇文章我们分析下间隙锁在唯一索引中的应用。

一样,我们先创建表,包含id和age两个字段,其中id是主键,而age是唯一索引,如下:

代码语言:javascript
复制
mysql--dba_admin@127.0.0.1:yeyztest ::>>show create table child;
+-------+---------------------------------------------------------------
| Table | Create Table                                                  
+-------+---------------------------------------------------------------
| child | CREATE TABLE `child` (
  `id` int() NOT NULL,
  `age` int() NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uni_age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------
 row in set (0.00 sec)

查看表中的数据,如下:

代码语言:javascript
复制
mysql--dba_admin@127.0.0.1:yeyztest ::>>select * from child;
+----+-----+
| id | age |
+----+-----+
|   |    |
|  |   |
|  |   |
|  |   |
|  |   |
|  |   |
|  |   |
+----+-----+
 rows in set (0.00 sec)

在唯一索引中,因为根据select * from child where age=13的情况下只能检索到一条记录,所以不牵扯幻读的问题。我们看看实验中的情况吧:

可以看到,当我们在session 1中锁定记录age=13的时候,包含了这条记录,在session B中可以插入age=12和14的值。也就是说,不存在gap锁。

再看下一个实验:

我们可以看到,在我们搜索age=15的时候,这条记录是不存在的,那么在session B中插入id=14的这条记录的时候,我们发现是无法插入的,产生了锁等待,这就说明当记录不存在的时候,唯一索引中也会产生间隙锁。

如果唯一索引是主键呢?答案是一样的,我们使用drop操作干掉age字段上的唯一索引,如下:

代码语言:javascript
复制
mysql:yeyztest ::>>alter table child drop index uni_age;
Query OK,  rows affected (0.00 sec)
Records:   Duplicates:   Warnings: 

mysql:yeyztest ::>>show create table child\G
*************************** 1. row ***************************
       Table: child
Create Table: CREATE TABLE `child` (
  `id` int() NOT NULL,
  `age` int() NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
 row in set (0.00 sec)

然后我们再去测试id列的插入和锁定,实验如下:

总结一下

当字段是唯一索引或者主键的时候,间隙锁产生的规则如下:

1、如果查询的结果中包含这个记录,那么在另外的会话上插入该记录前后间隙的记录时,不会产生间隙锁

2、如果查询的结果中不包含这个记录,那么在另外的会话上插入该记录前后间隙的记录时,会产生间隙锁。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档