锁--07_1----插入意向锁-Insert加锁过程

2023-12-16 08:28

本文主要是介绍锁--07_1----插入意向锁-Insert加锁过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 插入意向锁
  • MySQL执行插入Insert时的加锁过程
    • MySQL官方文档
    • MySQL insert加锁流程
        • 1.加插入意向锁
        • 2.判断插入记录是否有唯一键
        • 3. 插入记录并对记录加X锁
        • ==插入意向锁----> S锁----> X锁---->执行插入==
    • 案例
    • 在这里插入图片描述 insert加锁的小结
    • 建议:


插入意向锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MySQL执行插入Insert时的加锁过程

MySQL官方文档

MySQL官方文档对Insert加锁情况的描述

在这里插入图片描述
解读:

  1. INSERT操作会对新插入的记录加行锁写锁(排它锁X锁);注意:区别于执行update,执行insert时这里加的是X锁,并非next-key lock,因此不会阻塞其他的事务对gap区间的插入操作;

  2. 在插入记录前,会向插入记录所在位置申请意向插入意向锁(Insertion Intention Gap Lock);只要不是插入的是同一行记录,多个事务对相同gap区间的插入意向锁操作不会冲突

  3. 对于唯一索引,发生唯一键冲突时,当前事务会先尝试在这条记录上加读锁S锁;加S锁的机制可能会导致死锁:即A线程占用记录的X锁,B、C阻塞,它们需要先获取S锁再获取X锁执行更新;当A释放X锁时,B、C同时拿到S锁(共享锁),但互相都无法继续获取X锁(S锁与X锁互斥),导致死锁;

MySQL insert加锁流程

1.加插入意向锁
  1. 首先对插入的间隙加插入意向锁(Insert Intension Locks);注意插入意向锁可以理解为只是个插入动作,并非真的加锁
  2. 如果该间隙已被加上了GAP锁(间隙锁)或 Next-Key 锁(含GAP 锁),则加锁失败,等待间隙释放;
  3. 如果没有,则加插入意向锁成功,表示可以插入;只要不是插入的是同一行记录,多个事务对相同gap区间加插入意向锁不会冲突;
2.判断插入记录是否有唯一键

[可选 唯一键]然后判断插入记录是否有唯一键,如果有,则需要进行唯一性约束检查:

  • 如果不存在相同键值,则准备插入;
  • 如果存在相同键值,则判断该键值是否加锁;

如果没有锁, 判断该记录是否被标记为删除;

  • 如果标记为删除,说明删除事务已经提交,数据页上的记录还没来得及 purge,这时尝试加S锁;
  • 如果没有标记删除,说明数据已存在,本次插入会导致唯一键冲突,则报 1062 duplicate key 错误

如果有锁,说明该记录正在被处理(正在被其他事务新增、删除或更新),且其他事务还未提交,则当前事务尝试加S锁后会进入阻塞,等待其他事务释放记录X锁;

3. 插入记录并对记录加X锁

插入记录并对记录加X锁,当前事务提交或回滚时释放X锁;

插入意向锁----> S锁----> X锁---->执行插入

案例

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述 insert加锁的小结

  • 关于隐式锁,一般使用自增主键且不含唯一键的insert语句,并发时不会有冲突,因为插入意向锁是隐式锁,实际代表的是一个准备插入的行为;这个行为只和间隙锁GAP锁冲突;
  • 关于锁升级,当插入的数据含唯一键,出现并发插入时(如事务A和事务B,事务A先执行insert但还未提交事务),后执行插入的事务B会使用当前读,如果发现这条记录已存在(还未提交),则会先尝试获取S锁;此时事务A的插入意向锁(隐式锁)会被提升为显式锁( X 锁),导致事务B阻塞;
  • 关于插入死锁;正是MySQL这种唯一键冲突时的insert插入获取锁的规则,导致了在[case2:并发插入事务中的顺序顺序不一致]、[case3: 删除提交但还未purge]、或[case4: 并发插入事务中单条回滚]的case下,会出现并行的事务先拿到S锁(共享锁),但在执行insert加X锁时,发现阻塞,构成死锁;这个问题在MySQL官方文档也提到了;

建议:

  1. 针对case2,保证各个事务线程执行插入时,插入数据的顺序相同,避免死锁;尽量保证数据有序插入
  2. 针对case3和case4,保证各个事务线程执行含唯一键的数据插入前,先对数据加X锁,即跳过insert加锁机制的先尝试获取S锁这一阶段;如select … for update;如果查到了,则跳过插入;

这篇关于锁--07_1----插入意向锁-Insert加锁过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499836

相关文章

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal