MySQL的InnoDB引擎 在不同 SQL 语句中设置的锁

  • 执行锁定读操作(如 SELECT ... FOR UPDATE/SHARE)、UPDATE 或 DELETE 通常会对处理 SQL 语句时扫描到的每个索引记录设置记录锁,即使 WHERE 条件可能排除了某些行也一样。这些锁通常是"下一个键锁"(next-key locks),它们还会阻止在记录之前的“间隙”内进行插入。但可以显式禁用间隙锁定,从而不使用下一个键锁。事务隔离级别也会影响设置的锁类型。

  • 如果搜索中使用了二级索引,并且需要设置的索引记录锁是排他性的,InnoDB 还会检索相应的聚簇索引记录并对其设置锁。

  • 如果没有适合语句的索引,并且 MySQL 必须扫描整个表来处理语句,则整个表的每一行都将被锁定,从而阻塞其他用户对该表的所有插入操作。创建良好的索引非常重要,以便您的查询不扫描比必要更多的行。

  • 对于锁定读取、UPDATE 和 DELETE 语句,根据语句是否使用唯一索引和唯一搜索条件或范围类型搜索条件而采取不同的锁。

    • 对于有唯一搜索条件的唯一索引,只锁定找到的索引记录,不锁定其前面的间隙。

    • 对于其他搜索条件和非唯一索引,会锁定被扫描的索引范围,并使用间隙锁或下一个键锁阻止其他会话插入到范围覆盖的间隙中。

  • 对于搜索遇到的索引记录,SELECT ... FOR UPDATE 阻止其他会话执行 SELECT ... FOR SHARE 或在某些事务隔离级别下读取。一致读取会忽略在读取视图中存在的记录上设置的任何锁。

  • UPDATE ... 在搜索遇到的每条记录上设置排他性的下一个键锁。但是,使用唯一索引锁定行以搜索唯一行的语句只需要索引记录锁。

  • 当 UPDATE 修改聚簇索引记录时,在受影响的二级索引记录上也会隐式地设置锁。在插入新的二级索引记录之前,执行重复检查扫描时以及插入新的二级索引记录时,操作也会在受影响的二级索引记录上设置共享锁。

  • DELETE FROM ... 在搜索遇到的每条记录上设置排他性的下一个键锁。但是,使用唯一索引锁定行以搜索唯一行的语句只需要索引记录锁。

  • INSERT 在插入的行上设置排他锁。这个锁是索引记录锁,而不是下一个键锁(没有间隙锁),不会阻止其他会话在插入行之前的间隙中插入。

  • 在插入行之前,会设置一种称为插入意向间隙锁的间隙锁。这种锁表示插入的意图,多个事务在相同索引间隙中插入时无需等待彼此,只要它们不是在间隙中的相同位置插入。

  • 如果发生重复键错误,将在重复的索引记录上设置共享锁。如果尝试插入相同行的多个会话与已经拥有排他锁的另一个会话冲突,可能会导致死锁。

例如,假设有 InnoDB 表 t1,其结构如下:

CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;

现在假设三个会话按顺序执行以下操作:

会话 1:

START TRANSACTION; 
INSERT INTO t1 VALUES(1);

会话 2:

START TRANSACTION; 
INSERT INTO t1 VALUES(1);

会话 3:

START TRANSACTION; INSERT INTO t1 VALUES(1);

会话 1:

ROLLBACK;

会话 1 的第一个操作获得了行的排他锁。会话 2 和 3 的操作都导致重复键错误,并且它们都请求行的共享锁。当会话 1 回滚时,它释放了对行的排他锁,同时授予了会话 2 和 3 的共享锁请求。此时,会话 2 和 3 发生死锁:由于彼此持有共享锁,两者均不能获取行的排他锁。

  • INSERT ... ON DUPLICATE KEY UPDATE 与普通的 INSERT 不同,当发生重复键错误时,将对待更新的行放置排他锁而不是共享锁。对于重复的主键值,会获得排他的索引记录锁;对于重复的唯一键值,会获得排他的下一个键锁。

  • REPLACE 在没有唯一键冲突时像 INSERT 一样执行。否则,将在要替换的行上放置一个排他的下一个键锁。

  • INSERT INTO T SELECT ... FROM S WHERE ... 在插入到 T 的每一行上设置排他索引记录锁(没有间隙锁)。如果事务隔离级别是 READ COMMITTED,InnoDB 会对 S 进行一致性读取(无锁)。否则,InnoDB 会在 S 的行上设置共享的下一个键锁。

  • CREATE TABLE ... SELECT ... 使用共享的下一个键锁或作为一致读取来执行 SELECT,就像 INSERT ... SELECT。

  • 当使用 SELECT 在 REPLACE INTO t SELECT ... FROM s WHERE ... 或 UPDATE t ... WHERE col IN (SELECT ... FROM s ...) 结构中时,InnoDB 会在表 s 的行上设置共享的下一个键锁。

  • InnoDB 在初始化之前指定的 AUTO_INCREMENT 列的索引末端设置排他锁。

具有 innodb_autoinc_lock_mode=0 时,InnoDB 使用特殊的 AUTO-INC 表锁模式,在访问自增计数器时获取锁并保持至当前 SQL 语句结束。其他客户端不能在持有 AUTO-INC 表锁时向表中插入数据。innodb_autoinc_lock_mode=2 不使用表级 AUTO-INC 锁。

  • 具有外键约束的表上的任何插入、更新或删除操作,如果需要检查该约束条件,则会在它查看的记录上设置共享级别的记录锁。即使约束失败,InnoDB 也会设置这些锁。

  • LOCK TABLES 设置表锁,这是在 MySQL 上层而不是 InnoDB 层完成的。如果 innodb_table_locks = 1(默认设置)且 autocommit = 0,则 InnoDB 会意识到表锁,并且 MySQL 上层也会知道行锁。

  • LOCK TABLES 如果 innodb_table_locks=1(默认值),会在每个表上获取两个锁。除了 MySQL 层的表锁外,它还会获取一个 InnoDB 表锁。要避免获取 InnoDB 表锁,可以设置 innodb_table_locks=0。如果没有获得 InnoDB 表锁,那么即使一些表记录正在被其他事务锁定,LOCK TABLES 也可以完成。

  • 在事务被提交或中止时,所有由事务持有的 InnoDB 锁都会被释放。因此,在 autocommit=1 模式下对 InnoDB 表使用 LOCK TABLES 没有太大意义,因为获得的 InnoDB 表锁将立即被释放。

  • 事务进行过程中不能锁定额外的表,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

主机安全加固之-openssh版本升级

升级openssh之前,为了保证能正常通过工具连接主机,咱们开启telnet服务,通过telnet的方式登录主机 一:开启telnet服务 1.安装telnet服务 [rootlocalhost ~]# yum install –y telnet telnet-server xinetd2.修改telnet服务配置文…

Docker中安装MySql的遇到的问题

目录 一、mysql查询中文乱码问题 1. 进入mysql中进行查看数据库字符集 2. 修改 my.cnf 中的配置 3. 重启mysql容器,使得容器重新加载配置文件 4. 测试结果 二、主从同步中遇到的问题 2.1 Slave_IO_Running:Connecting 的解决方案 1. 确定宿主机防火墙开放my…

React useEffect使用

第一 export default function App() { const [name,setname] useState(huhu) useEffect(()>{ setname(name.substring(0,1).toUpperCase()name.substring(1)) },[name]) //[name,age]//可以有多个参数 //带参数,第一次默认执行一次,第二次name更新…

留学生怎么合理使用ChatGPT ?还有哪些同类工具可以使用?

一篇篇相关于ChatGPT的文章陆陆续续铺天盖地的出现在我们面前。今天我们来看看怎么使用这个宝藏工具! 文章主要内容为: 1.它是什么? 2.它能做什么? 3.作为留学生我们怎么使用它? 4.其他同类工具推荐 5.个人观点 一…

unity addressables 加载资源和场景 显示进度条(主要用于WebGL)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、addressables是什么?二、导入Addressables三、创建Addressables Settings 资产包管理四、资源打包五、环境模拟六、查看重复资源七、选择Bundle…

算法——A/算法通识

目录 一、复杂度分析 A/时间复杂度 B/空间复杂度 C/分析技巧 二、枚举分析 A/枚举算法介绍 B/解空间的类型 C/循环枚举解空间 三、模拟算法 四、递归 A/递归介绍 递归的两个关键要素: B/递归如何实现 C/递归和循环的比较 一、复杂度分析 A/时间复杂度…

央视见证|“看见中国汽车”走进首家汽车供应链企业东软睿驰

由工业和信息化部支持指导,中国汽车工业协会和央视网联合出品的2023《看见中国汽车》专题东软睿驰篇正式上线,记录品牌向上专项行动走进首家汽车供应链企业,展示东软睿驰围绕“成为OEM 软件定义汽车时代最可信赖的合作伙伴”核心战略的创新发…

深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信

在Java中,处理I/O(输入/输出)操作的方式经历了从BIO(Blocking I/O,阻塞式I/O)到NIO(New I/O 或 Non-blocking I/O,新I/O或非阻塞式I/O)的演变。这两种模型在设计和使用上…

[C++]类和对象(中)

一:类的六个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中并不是什么都没有,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为…

使用Python的Turtle模块简单绘制烟花效果

import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…

GEDepth:Ground Embedding for Monocular Depth Estimation

参考代码:gedepth 出发点与动机 相机的外参告诉了相机在世界坐标系下的位置信息,那么可以用这个外参构建一个地面基础深度作为先验,后续只需要在这个地面基础深度先验基础上添加offset就可以得到结果深度,这样可以极大简化深度估…

springboot与springcloud之间的版本对应关系

https://start.spring.io/actuator/info 当然,你可以直接在: https://spring.io/projects/spring-cloud 上看文档查询, 不过,最后应该是调到这里的: https://github.com/spring-cloud/spring-cloud-release/wiki/Suppo…

C++:输入流/输出流

C流类库简介 C为了克服C语言中的scanf和printf存在的缺点。,使用cin/cout控制输入/输出。 cin:表示标准输入的istream类对象,cin从终端读入数据。cout:表示标准输出的ostream类对象,cout向终端写数据。cerr&#xff…

stable diffusion微调总结

stable diffusion微调总结 stable diffusion模型类别:SDSD2SDXLSDXL LCM(潜在一致性模型)SDXL DistilledSDXL Turbo 安装accelerate通过pip安装配置 accelerate config查看配置 安装diffusers数据处理BLIP模型优化 微调方法Dreambooth微调准备…

静态代理IP是如何助力跨境电商运营的?

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

微信小程序 安卓/IOS兼容问题

一、背景 在开发微信小程序时,不同的手机型号会出现兼容问题,特此记录一下 二、安卓/IOS兼容问题总结 2.1、new Date()时间转换格式时,IOS不兼容 问题:在安卓中时间格式2024-1-31 10:10:10,但是在iOS中是不支持 &q…

jQuery前段开发--星级评价和图形跟随指针移动

一、实验原理: 当鼠标移入某个星星,前面的星星都会被点亮;当鼠标移出,星星将会变暗,单击某个星星后,即可完成评论,此时鼠标移出后,被单击星星前面的星星都会被点亮,后面…

算法训练营day20,二叉树9

type TreeNode struct { Val int Left *TreeNode Right *TreeNode } //669. 修剪二叉搜索树 //本题与450. 删除二叉搜索树中的节点 相似,不同之处在于本题删除不止一个节点,450不需要遍历全部二叉树,但本题需要全部遍历,而且…

数据结构—静态查找

简介 1. 数据的组织和查找是大多数应用程序的核心 2. 线性表、树、图是数据的组织结构 3. 查找是所有数据处理中最基本、最常用的操作 4. 当在一个庞大数量的数据集合中查找时,查找方法和效率就显得格外重要 查找介绍 1. 查找包含四种操作:查询、检…

幻兽帕鲁社区服务器搭建架设开服教程(LINUX)

幻兽帕鲁社区服务器搭建架设开服教程(LINUX) 大家好我是艾西,上一期我给大家分享了windows系统版本的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对于服务器的配置有一定的要求很多小伙伴就思考用linux系统搭建的话占用会不会小一点&#x…