介绍下InnoDB的锁机制?

在InnoDB中,锁可以分为两种级别,一种是共享锁(S锁),另一种是排他锁(X锁)。

共享锁&排他锁

共享锁又称为读锁,由读取操作创建。其他用户可以并发读取数据,但直到所有共享锁都被释放之前,任何事务都无法对数据进行修改(获得数据上的排他锁)。

如果事务T对数据A加上共享锁后,其他事务只能对A再加共享锁,而不能加排他锁。获得共享锁的事务只能读取数据,而不能修改数据。

SELECT ... LOCK IN SHARE MODE;

在查询语句后添加LOCK IN SHARE MODE,MySQL会为查询结果中的每行加上共享锁。只有当没有其他线程对查询结果集中的任意行使用排他锁时,才能成功获取共享锁;否则将被阻塞。其他线程可以读取已经被加了共享锁的表,且这些线程将读取相同版本的数据。

排他锁又称为写锁,一旦事务T对数据A加上排他锁,其他事务就无法再对A加任何类型的锁。获得排他锁的事务既可读取数据,又可修改数据。

SELECT ... FOR UPDATE;

除了S锁X锁之外,InnoDB还有另外两种锁,分别是IX锁和IS锁,这里的"I"代表着"Intention",即意向锁。IX即意向排他锁,IS即意向共享锁。

在查询语句后添加FOR UPDATE,MySQL会对查询命中的每条记录都加排他锁(如果有索引,则通过索引加锁;如果没有索引,则会锁定整个表)。只有当没有其他线程对查询结果集中的任何一行使用排他锁时,才能成功申请排他锁;否则将被阻塞。

意向锁

在MySQL的InnoDB引擎中,支持多种锁级别,包括行级锁和表级锁。当多个事务需要访问共享资源时,如果每个事务都直接请求锁,可能会导致彼此相互阻塞,甚至引发死锁。

举个例子:

事务A对表Table1中的某一行加上了行级锁,这导致该行只能读取而不能修改。与此同时,事务B试图申请对Table1的表级锁。如果事务B成功获取表级锁,那么它就能修改表中的任意一行记录,从而引发冲突。

为解决这一问题,事务B在申请Table1的表级锁时,需要先检查是否有其他事务已经加了行级锁。然而,事务B无法简单地遍历表中所有数据逐行判断是否已被锁定,这样效率太低了。

为了解决这一问题,MySQL引入了意向锁机制。意向锁作为一种锁机制,在数据库管理系统中旨在协调不同锁粒度(如行级锁和表级锁)之间的并发问题。(对于同一锁粒度内的并发问题,如多个行级锁之间的冲突,则通过行级互斥锁来解决。)

注意:

  1. 意向锁并非直接锁定资源,而是用于通知其他事务,以防止它们在相同资源上设置不兼容的锁。
  2. 意向锁不是由用户直接请求的,而是由MySQL系统管理的。

当一个事务请求获取行级锁或表级锁时,MySQL会自动获取相应表的意向锁。这样一来,其他事务在请求表锁时,可以先通过该意向锁探知是否有已经加锁,并根据意向锁的类型(意向共享锁/意向排它锁)判断自身是否可获取锁。这种方式在不阻塞其他事务的情况下,为当前事务锁定资源。

意向锁有两种类型:意向共享锁和意向排它锁。

  1. 意向共享锁:代表事务打算对资源设置共享锁(读锁)。通常用于暗示事务打算读取资源,不希望在读取时有其他事务设置排它锁。
  2. 意向排它锁:代表事务打算对资源设置排它锁(写锁)。这表明事务计划修改资源,不希望其他事务同时设置共享或排它锁。

意向锁是表级锁,在触发意向锁的事务提交或回滚后会释放。

以下是MySQL官网上给出的这几种锁之间的冲突关系:

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

image.png

记录锁

记录锁(Record Lock)是一种加在索引记录上的锁,用于保护特定行数据的完整性。例如,对于语句 SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;,将会对满足条件 c1=10 的记录加锁,以防止其他事务对该行进行插入、更新或删除操作。

尽管记录锁通常被称为行级锁,但需要特别注意的是,它实际上锁定的是索引记录而非数据行本身。此外,记录锁仅限于锁定索引

当表中不存在索引时该如何处理?InnoDB 引擎会自动创建一个隐藏的聚簇索引,并使用该索引进行记录锁定。

若表中未定义主键,MySQL会默认选择一个唯一的非空索引作为聚簇索引。若不存在适用的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。

关于记录锁的加锁原则。感兴趣的小伙伴一键三连。后续可以出一片文章。

插入记录锁

插入意向锁是一种由插入操作在行插入之前设置的间隙锁。这种锁表明了插入的意图,以这样一种方式,如果多个事务尝试插入到同一索引间隙但不在间隙内的相同位置,则它们不需要相互等待。

举例来说,假设存在索引记录的值为4和7。当不同事务分别尝试插入值为5和6时,它们会在获取插入行的独占锁之前,各自使用插入意向锁锁定4和7之间的间隙。由于它们插入的行并不冲突,因此它们不会相互阻塞。然而,如果它们都试图插入6,那么就会发生阻塞情况。

AUTO-INC 锁

AUTO-INC 锁是一种特殊的表级锁,由向包含 AUTO_INCREMENT 列的表插入数据的事务所获取。在最简单的情况下,如果一个事务正在向表中插入值,其他任何事务都必须等待,以便执行它们自己的插入操作,这样第一个事务插入的行就会接收到连续的主键值。

innodb_autoinc_lock_mode 变量控制用于自增锁定的算法。它允许你在可预测的自增值序列和插入操作的最大并发性之间进行权衡。

在MySQL 5.1之前,AUTO-INC锁是一种表级锁。

如有问题,欢迎加微信交流:w714771310,备注- 技术交流  。或微信搜索【码上遇见你】。

免费的Chat GPT可微信搜索【AI贝塔】进行体验,无限使用。

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

能远程一起观看电影和直播的SyncTV

什么是 SyncTV ? SyncTV 是一个允许您远程一起观看电影和直播的程序。它提供了同步观看、剧院和代理功能。使用 SyncTV,您可以与朋友和家人一起观看视频和直播,无论他们在哪里。SyncTV 的同步观看功能确保所有观看视频的人都在同一点上。这意…

C++ BuilderXE 计算程序运行时间精确到毫秒

#include <time.h> // //计算时间 clock_t start,end,dtStart; startclock(); // ProgressBar1->Percent0; // // ProgressBar1->Percenti/DDnum*100; // Application->ProcessMessages(); // //操作完成计时 …

使用Flask构建POST请求的Web应用

文章目录 准备工作创建路由处理POST请求创建表单页面运行应用结论 在Web开发中&#xff0c;处理POST请求是一项常见任务&#xff0c;特别是在构建表单提交、用户注册和数据提交等功能时。Flask是一个简单而强大的Python Web框架&#xff0c;它提供了方便的工具来处理HTTP请求&a…

目标检测算法YOLOv7简介

YOLOv7由Chien-Yao Wang等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2207.02696 &#xff0c;项目网页&#xff…

激光雷达:盲人世界的导航灯塔

在科技日新月异的今天&#xff0c;一项名为“蝙蝠避障”的创新成果&#xff0c;正悄然改变着盲人朋友的日常生活&#xff0c;特别是在出行这一领域&#xff0c;它的应用如同一束光&#xff0c;照亮了前行的道路。本文将深入探讨激光雷达技术对盲人的帮助&#xff0c;揭示这项高…

【JavaWeb】网上蛋糕商城后台-商品管理

概念 本文讲解和实现网上蛋糕商城的后台管理系统中的商品管理功能。 商品列表 点击后台管理系统的head.jsp头部的“商品管理”功能选项&#xff0c;向服务器发送请求/admin/goods_list 因此需要在servlet包中创建AdminGoodsListServlet类&#xff0c;用于获取商品信息列表 …

【赠书活动第4期】《Rust编程与项目实战》

赠书活动 《Rust编程与项目实战》免费赠书 3 本&#xff0c; 收到赠书之后&#xff0c;写一篇 本书某一节内容 的学习博客文章。 可在本帖评论中表示参加&#xff0c;即可获得赠书&#xff0c;先到先得。学习心得博客链接&#xff0c;后面有空发上来。 赠书截止日期为送出3…

elementui的table行展开,左侧的icon有的需要有的不需要

百度了一些方法&#xff0c;都不好用&#xff0c;最后还是纯css解决&#xff0c;以下是效果&#xff1a; 代码实现&#xff1a; :deep(.el-table__row:nth-child(1) .el-table__expand-icon){ display: none; }

《解锁高效合同管理系统:优化业务流程,提升管理效率》

随着企业规模的扩大和业务复杂性的增加&#xff0c;合同管理变得愈发重要。合同是企业与客户、供应商、合作伙伴之间的法律约束和商业承诺&#xff0c;而有效的合同管理系统则成为企业提高运营效率、降低风险的关键工具。本文将探讨合同管理系统的重要性以及如何利用合同管理系…

win10 miniconda始终无法在指定的位置创建虚拟环境,原来是管理员权限问题

当我想用conda创建虚拟环境时 envs_dirs: F:\miniconda3\envsC:\Users\fengx.conda\envsC:\Users\fengx\AppData\Local\conda\conda\envs 创建的虚拟环境始终在C:\Users\fengx.conda\envs\xxxx这个位置下&#xff0c; 我已经明显指定了位置是在F:\miniconda3\envs下&#xff…

MyBatis——模拟MyBatis框架

一、dom4j 解析 XML 文件 在 dom4j 中&#xff0c;DOMReader 和 SAXReader 是两种不同的 XML 解析器。 它们的主要区别在于解析 XML 的方式和所提供的功能&#xff1a; DOMReader&#xff1a; DOMReader 使用 DOM&#xff08;Document Object Model&#xff09;模型来表示整个…

org.hsqldb.jdbcDriver 类,导致 ClassNotFoundException 异常如何解决?

确保JDBC驱动包存在&#xff1a;检查系统是否已经安装了HSQLDB JDBC驱动。如果没有安装或驱动没有正确放置在类路径中&#xff0c;需要下载并添加它。你可以从 HSQLDB官网 下载JDBC驱动包。 添加JDBC驱动到类路径&#xff1a;将下载的HSQLDB JDBC驱动&#xff08;通常是一个JA…

基于STM32F401RET6智能锁项目(使用库函数点灯、按键)

点灯硬件原理图 1、首先&#xff0c;我们查看一下原理图&#xff0c;找到相对应的GPIO口 LED_R低电平导通&#xff0c;LED4亮&#xff0c;所以LED_R的GPIO口需要配置一个低电平才能亮&#xff1b; LED_G低电平导通&#xff0c;LED3亮&#xff0c;所以LED_R的GPIO口需要配置一…

解决常见的Android问题

常见问题&#xff1a; 1、查杀&#xff1a; 查杀一般分为两个方向一种是内存不足的查杀&#xff0c;一种的是因为温度限频查杀&#xff0c;统称为内存查杀&#xff0c;两个问题的分析思路不同 1、内存不足查杀&#xff1a; 主要是因为当用户出现后台运行多个APP或者是相机等…

AE 电源 DC 80 kW PulsarAccessory User ManualMay 20055703041-C说明数

AE 电源DC 80 kW Pulsar Accessory User ManualMay20055703041C说明

Android 12.0 TvSettings系统设置wifi连接密码框点击Enter键失去焦点

1.前言 在12.0的系统box产品开发中,在TvSettings中,在wifi连接的时候,在用遥控器输入wifi密码框的时候,会发现在按遥控器Enter键的时候, 发现EditText焦点失去了,导致输入法消失了,为了解决这个问题就需要拦截Enter键保证正常输入wifi密码,接下来就来实现这个功能 如图…

Ansible的安装与配置

Ansible的安装与配置 1. 安装ansible # ansible是epel源提供的&#xff0c;所以必须安装epel&#xff1a; [rootRocky9 ~]# yum -y install epel-release Last metadata expiration check: 0:01:53 ago on Tue 26 Dec 2023 10:05:34 PM CST. Dependencies resolved. Package …

iPhone苹果手机下载安装Skype苹果applestore怎么切换账号?

iPhone苹果手机下载安装Skype需要切换到可下载Skype应用的地区苹果账号&#xff0c;才能搜索找到并下载Skype到苹果手机。请按下面的教程切换苹果账号下载安装Skype到苹果手机。 *注&#xff1a;如果您没有可下载Skype应用的苹果账号&#xff0c;请打开「词令」关键词口令直达…

社交媒体数据恢复:飞书

飞书数据恢复过程包括以下几个步骤&#xff1a; 确认数据丢失&#xff1a;首先要确认数据是否真的丢失&#xff0c;有时候可能只是被隐藏或者误操作删除了。 检查回收站&#xff1a;飞书中删除的文件会默认保存在回收站中&#xff0c;用户可以通过进入回收站找到被删除的文件&…

简单的神经网络

一、softmax的基本概念 我们之前学过sigmoid、relu、tanh等等激活函数&#xff0c;今天我们来看一下softmax。 先简单回顾一些其他激活函数&#xff1a; Sigmoid激活函数&#xff1a;Sigmoid函数&#xff08;也称为Logistic函数&#xff09;是一种常见的激活函数&#xff0c…