当前位置: 首页 > news >正文

记录锁,间隙锁,插入意向锁,临键锁兼容关系

插入意向锁是什么?

注意!插入意向锁名字里虽然有意向锁这三个字,但是它并不是意向锁,它属于行级锁,是一种特殊的间隙锁。

在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 语句会被阻塞,并生成一个插入意向锁 。
*插入意向锁是一种间隙锁。
*
在行执行 INSERT 之前的插入操作设置。如果多个事务 INSERT 到同一个索引间隙之间,但没有在同一位置上插入,则不会产生任何的冲突。假设有值为4和7的索引记录,现在有两事务分别尝试插入值为 5 和 6 的记录,在获得插入行的排他锁之前,都使用插入意向锁锁住 4 和 7 之间的间隙,但两者之间并不会相互阻塞,因为这两行并不冲突。

间隙锁和插入意向锁

总结:插入意向锁只会和 间隙或者 临键Next-key 锁冲突,正如上面所说,间隙锁作用就是防止其他事务插入记录造成幻读,正是由于在执行 INSERT 语句时需要加插入意向锁,而插入意向锁和间隙锁冲突,从而阻止了插入操作的执行。

间隙锁和间隙锁

两个事务即使生成的间隙锁的范围是一样的,也不会发生冲突,因为间隙锁目的是为了防止其他事务插入数据,因此间隙锁与间隙锁之间是相互兼容的。

在执行插入语句时,如果插入的记录在其他事务持有间隙锁范围内,插入语句就会被阻塞,因为插入语句在碰到间隙锁时,会生成一个插入意向锁,然后插入意向锁和间隙锁之间是互斥的关系。

如果两个事务分别向对方持有的间隙锁范围内插入一条记录,而插入操作为了获取到插入意向锁,都在等待对方事务的间隙锁释放,于是就造成了循环等待,满足了死锁的四个条件:互斥、占有且等待、不可强占用、循环等待,因此发生了死锁

在这里插入图片描述

http://www.lryc.cn/news/10469.html

相关文章:

  • map相关接口(map接口、HashMap、LinkedHashMap、TreeMap)
  • 抽象工厂模式(Abstract Factory Pattern)
  • Linux驱动学习笔记
  • tarfile — 访问 Tar 压缩文件
  • C++14深度探索之C++基础-共享指针与弱指针使用
  • 【React全家桶】reac组件通信
  • 2023,再转行去做软件测试还有前途吗?
  • Java程序API数据接口
  • 剑指offer 7 数组中和为0的三个数
  • DockerFile
  • Vue-Router 介绍及路由原理分析
  • git代码提交后jenkins构建和自动部署
  • 2023面试题目总结
  • Vue常用指令及声明周期
  • MariaDB 成功敲钟上市 | 它与 Navciat 缘起 10 年前
  • LESS模型与随机森林
  • 如何利用Power Virtual Agents机器人实现成绩查询服务
  • flavor 配置
  • 《第一行代码》 第五章:详解广播机制
  • Leetcode(每日一题)——1139. 最大的以 1 为边界的正方形
  • YOLOv5:GitHub两万八Star项目
  • 袋鼠云产品功能更新报告04期丨2023年首次,产品升级“狂飙”
  • 如何在Power Virtual Agents中使用Power Automate
  • BXC6332A第二代智能头盔方案助力电动车市场,为安全保驾护航
  • 浮点数值计算精度丢失问题剖析及解决方法
  • 字符串匹配 - 模式预处理:朴素算法(Naive)(暴力破解)
  • CVE-2021-42278 CVE-2021-42287域内提权漏洞
  • 关于IcmpSendEcho2的使用和回调问题
  • XQuery 术语
  • 会议论文分享-Security22-状态感知符号执行