iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中的插入意向锁是什么
  • 432
分享到

MySQL中的插入意向锁是什么

mysql 2023-01-06 12:01:32 432人浏览 安东尼
摘要

今天小编给大家分享一下Mysql中的插入意向锁是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解

今天小编给大家分享一下Mysql中的插入意向是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Insert Intention Lock,中文我们也称之为插入意向锁。

1. 为什么需要插入意向锁

我们之前已经有 Gap Lock 了,Gap Lock 可以帮我们在一定程度上解决幻读问题,但是,之前的似乎有点问题。

假设我有如下一张表:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) NOT NULL,  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

id 是主键自增;age 是一个普通索引,现在表中有如下数据:

MySQL中的插入意向锁是什么

假设我想执行如下的插入 sql

begin;insert into user(username,age) values('wangwu',95);

注意,这个 SQL 执行了但是事务还没有提交。

按照我们之前学习的关于 Gap Lock 的知识分析一下,此时间隙锁的范围是 (89,99),意思是这个范围的 age 都不可以插入。

如果是这样的话,小伙伴们会发现数据插入的效率可就太低了,很容易发生锁冲突,那么怎么办?

我们今天要介绍的插入意向锁就是用来解决这个问题的。

2. 什么是插入意向锁

我们来看看 mysql 官网的介绍:

An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6, respectively, each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting.

大致翻译下一下就是这样:

插入意向锁是一种在 INSERT 操作之前设置的一种间隙锁,插入意向锁表示了一种插入意图,即当多个不同的事务,同时往同一个索引的同一个间隙中插入数据的时候,它们互相之间无需等待,即不会阻塞(要是单纯按照之前间隙锁的理论,必须要等一个间隙锁释放了,下一个事务才可以往相同的间隙处插入数据)。假设有值为 4 和 7 的索引记录,现在有两个事务,分别尝试插入值为 5 和 6 的记录,在获得插入行的排他锁之前,每个事务使用插入意向锁锁定 4 和 7 之间的间隙,但是这两个事务不会相互阻塞,因为行是不冲突的。

这就是插入意向锁。

3. 实践

小伙伴们注意,松哥之前和大家聊 Gap Lock,说过这个是可重复读(REPEATABLE READ)这个隔离级别下特有的产物,那么现在 Insert Intention Lock 是一种特殊的 Gap Lock,当然也是在可重复读这个隔离级别下生效。

接下来我们通过两个个简单的案例来演示一下插入意向锁。

3.1 案例一

我们的表结构以及数据和第一小节一致。

首先我们在会话 A 中,执行如下代码:

MySQL中的插入意向锁是什么

现在会话 A 中的事务没有提交。

接下来我们在会话 B 中,也执行一个插入操作:

MySQL中的插入意向锁是什么

我们发现会话 B 也可以正常执行,没有发生阻塞。

这说明,两个插入意向锁之间是兼容的,可以共存的。

3.2 案例二

我们再来看一个不兼容的例子。

首先在会话 A 中执行如下 SQL 查询 age 大于 80 的记录,并添加排他锁:

MySQL中的插入意向锁是什么

接下来在会话 B 中,执行如下代码插入一行数据:

MySQL中的插入意向锁是什么

小伙伴们看到,这个操作会被阻塞!阻塞的原因在于,插入意向锁和排他锁之间是互斥的。

趁着发生阻塞的这会,在会话 C 中,我们通过在前面文章中所使用的 show engine innodb status\G 指令,来查看下加锁的情况,重点看 TRANSACTION 节点:

MySQL中的插入意向锁是什么

在输出的内容中,红色框选中的地方,清楚的表明了插入意向锁的存在。

以上就是“MySQL中的插入意向锁是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中的插入意向锁是什么

本文链接: https://www.lsjlt.com/news/176913.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中的插入意向锁是什么
    今天小编给大家分享一下MySQL中的插入意向锁是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-01-06
    mysql
  • MySQL中的插入意向锁使用案例分析
    这篇文章主要讲解了“MySQL中的插入意向锁使用案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中的插入意向锁使用案例分析”吧! ...
    99+
    2023-02-07
    mysql
  • MySQL的意向共享锁、意向排它锁和死锁是什么
    本篇内容介绍了“MySQL的意向共享锁、意向排它锁和死锁是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、InnoDB的表级锁在绝大多...
    99+
    2023-07-02
  • sql server中意向锁的作用是什么
    本篇文章给大家分享的是有关sql server中意向锁的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  sql server中意向...
    99+
    2024-04-02
  • Oracle和MySQL中有意向锁吗
    这篇文章主要介绍“Oracle和MySQL中有意向锁吗”,在日常操作中,相信很多人在Oracle和MySQL中有意向锁吗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Orac...
    99+
    2024-04-02
  • mysql的批量插入是什么
    这篇文章主要讲解了“mysql的批量插入是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的批量插入是什么”吧!说明批量插入是一种逐条优化数据插入的方式。批量插入数据的语法类似于...
    99+
    2023-06-20
  • mysql记录锁是什么意思
    这篇文章主要介绍“mysql记录锁是什么意思”,在日常操作中,相信很多人在mysql记录锁是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql记录锁是什么意思”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • 当向 MySQL 中的 UNSIGNED 列插入负值时会发生什么?
    在MySQL中,当您将负值设置给UNSIGNED列时,会出现错误。例如,让我们首先创建一个带有一个UNSIGNED字段的表 −mysql> create table UnsignedDemo -> ( -> I...
    99+
    2023-10-22
  • php无法向mysql插入中文怎么办
    这篇文章主要介绍了php无法向mysql插入中文怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php无法向mysql插入中文的解决办法:首先将字符串str从“in_ch...
    99+
    2023-06-15
  • vue中的插槽是什么意思
    这篇文章主要为大家展示了“vue中的插槽是什么意思”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中的插槽是什么意思”这篇文章吧。一、认识插槽Slot前面我们会通过props传递给组件一些数...
    99+
    2023-06-29
  • mysql意向锁的类型有哪些
    这篇文章主要介绍“mysql意向锁的类型有哪些”,在日常操作中,相信很多人在mysql意向锁的类型有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql意向锁的类型有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-20
  • mysql中什么是行锁
    mysql中什么是行锁?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、说明InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。并且该索引不能失效,否则都会从行锁升级为...
    99+
    2023-06-15
  • 利用Python向mysql插入中文时出
    在利用python向mysql插入中文时,出现错误,代码如下: importpymysql try: #首先要链接mysql db=pymysql.connect(“127.0.0.1”,”root”,”123...
    99+
    2023-01-31
    中文 Python mysql
  • MySQL中锁的概念是什么
    今天就跟大家聊聊有关MySQL中锁的概念是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。乐观锁乐观锁大多是基于数据版本记录机制实现,一般是给数据...
    99+
    2024-04-02
  • MySQL中的锁机制是什么
    这篇“MySQL中的锁机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL中的锁机制是什么”文章吧。一.概述锁...
    99+
    2023-07-05
  • MySQL中锁及加锁规则是什么
    小编给大家分享一下MySQL中锁及加锁规则是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL 引入锁的目的是为了解决...
    99+
    2024-04-02
  • 我们如何向 MySQL 表中插入新行?
    借助 INSERT INTO 命令,可以将新行插入到表中。语法INSERT INTO table_name values(value1,value2,…)示例假设我们有一个名为“Employee”的表,其中包含三列“Emp_i...
    99+
    2023-10-22
  • 使用python怎么向mysql中插入一个null值
    这期内容当中小编将会给大家带来有关使用python怎么向mysql中插入一个null值,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python在mysql中插入null空值sql = ...
    99+
    2023-06-07
  • MySQL中的/*是什么意思
    在MySQL中,/ /用于多行注释。它可以在SQL语句中的任何位置使用,用于注释掉一段代码或提供对代码的解释。多行注释可以跨越多个行...
    99+
    2023-10-20
    MySQL
  • 我们如何向 MySQL 表中插入数据?
    要将数据插入 MySQL 表,我们需要使用 INSERT INTO 命令。我们必须在 INSERT INTO 命令中指定表中所有列的值。语法INSERT INTO table_name values(value1,value2,&helli...
    99+
    2023-10-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作