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

MySQL行锁的实践

在MySQL中,根据加锁的粒度,可以将数据库的锁细分为表锁、行锁、页锁。其中,表锁(Table Lock)是一种粗粒度的锁,它锁定整个表,阻止其他事务访问表中的任何行;行锁(Row Lock)是一种细粒度的锁,它锁定指定的行;页锁(Page Lock)是介于行锁和表锁之间的一种锁机制,它锁定表的一个页或多个页。此外,无论是表锁,还是行锁,都可以根据是否独占数据还是共享数据,进一步细分为共享锁和排他锁。这里重点介绍下行锁,关于表锁和页锁可以参考笔者之前的MySQL锁概述一文。

行锁的实现方式

对不同的存储引擎,锁的支持情况和使用方式是不同的。如MyISAM只支持表级锁,不支持行锁。InnoDB默认采用行锁,在未使用索引字段查询时升级为表锁。需要说明的是,即便在条件中使用了索引字段,MySQL会根据自身的执行计划,考虑是否使用索引。如果MySQL认为全表扫描效率更高,即使指定了索引字段,也不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,有必要进一步检查SQL的执行计划,以确认是否真正使用了索引。
InnoDB为实现行锁,提供了多种实现方式。如记录锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock)等。需要说明的是,行锁仅在使用索引字段时才会生效,否则会升级为表锁

记录锁(Record Lock)

记录锁是封锁记录,记录锁也叫行锁,示例如下:

SELECT * FROM `test_table` WHERE `id` = 1 FOR UPDATE;

它会在 id=1 的记录上加上记录锁,以阻止其他事务插入,更新,删除 id=1 这一行。

间隙锁(Gap Lock)

间隙锁,锁定一个范围,但不包含记录本身,间隙锁是封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。间隙锁主要目的,也是为了避免出现幻读(Phantom Read),对应的事务的隔离级别降级为可重复读。如果将事务的隔离性级别调整成读已提交读未提交,间隙锁都会失效。间隙锁对应的事务隔离级别是可重复。示例如下:

SELECT * FROM `test_table` WHERE `id` > 100 FOR UPDATE

以下情况均会产生间隙锁:
(1) 使用普通索引,且需要锁定一个区间。
(2) 使用多列唯一索引,且需要锁定一个区间。
(3) 使用唯一索引,且需要锁定一个区间。
注意,间隙锁封锁的不是多条记录,而是一个区间,以防止出现幻读现象。

临键锁(Next-Key Lock)

临键锁,是记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。同间隙锁一样,临键锁也是为了避免出现幻读(Phantom Read)。同样的,临键锁对应的事务隔离级别是可重复。示例如下:

SELECT * FROM table WHERE age >=24 FOR UPDATE; 

临键锁会锁住一段左开右闭区间的数据。需要强调的一点是,InnoDB 中临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。

行锁的共享锁或排他锁

行锁支持设置共享模式或排他模式。其中共享模式允许其他事务读操作,不允许其他事务写操作,注意共享模式也不支持当前事务写操作。排他模式不允许其他事务读操作。不允许其他事务写操作。

共享

共享行锁的设置如下:

SELECT ... FOR SHARE

多事务并发环境中,通过LOCK IN SHARE MODE可以避免脏读(Dirty Read),即读取到其他事务未提交的数据。
SELECT … FOR SHARE 是 SELECT … LOCK IN SHARE MODE的升级写法,不同的用户应该根据当前的MySQL版本选择合适的写法。注意,MySQL兼容支持LOCK IN SHARE MODE的写法。此外,FOR SHARE支持NOWAIT和, SKIP LOCKED等选项。

排他

排他行锁的设置如下:

SELECT ... FOR UPDATE

共享锁适用于那些需要确保读取的数据在事务期间不被修改,但允许其他事务并发读取的场景,排他锁则适用于需要修改数据的场景,确保在修改过程中数据不会被其他事务读取或修改。

行锁的释放

无论是SHARE模式,还是UPDATE模式的行锁,都是在事务提交(commit)或事务回滚(rollback)的时候释放行锁。

行锁的等待

默认情况下,对于没有获得行锁的事务需要一直等待行锁的释放,这样可能会影响其他事务的执行。一种有效的处理方式是设置锁的等待策略。如指定等待时间、不等待、跳过锁定的数据等。MySQL不支持等待指定的时间(国产数据库OceanBase则支持设置行锁的等待时间,示例如下:SELECT … FOR UPDATE WAIT seconds),但支持设置不等待、跳过锁定的数据。示例语句如下:

SELECT ... FOR UPDATE NOWAIT
SELECT ... FOR UPDATE SKIP LOCKED

注意,以上能力是在MySQL 8.4版本及之后的版本才引入的功能。在使用的时候,要注意当前使用的MySQL版本。如果是低版本的MySQL,可以考虑在应用层做一些简单地处理。

行锁的超时时间

在MySQL中,不支持针对每个行锁实例设置超时时间,但是支持对所有的行锁设置超时时间,对应的参数是innodb_lock_wait_timeout。这个参数决定了InnoDB在放弃获取锁之前等待的时间长度(以秒为单位)。如果在指定的时间内无法获取锁,需要获取锁的事务将被回滚,并返回一个错误。innodb_lock_wait_timeout 的默认值取决于 MySQL 版本。通常,默认值是 50 秒。 行锁的超时设置示例如下:

// 全局设置
SET GLOBAL innodb_lock_wait_timeout = 30; -- 设置全局的超时时间为 30 秒
// Session设置
SET SESSION innodb_lock_wait_timeout = 30; -- 设置当前会话的超时时间为 30 秒

这样的话,如果在指定时间范围内无法获取锁,获取锁的事务将返回一个错误,提示锁等待超时。

行锁使用总结

行锁的使用场景,主要是用于需要实现细粒度锁控制的场景,如高并发场景。InnoDB为提供了多种行锁的实现方式,如记录锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock)等。需要说明的是,行锁仅在使用索引字段时才会生效,否则会升级为表锁
在使用行锁时,支持设置共享模式或排他模式。其中共享模式允许其他事务读操作,不允许其他事务写操作,注意共享模式也不支持当前事务写操作。排他模式不允许其他事务读操作,不允许其他事务写操作。
行锁的释放,都是在事务提交(commit)或事务回滚(rollback)的时候。
默认情况下,对于没有获得行锁的事务需要一直等待行锁的释放,这样可能会影响其他事务的执行。MySQL支持设置不等待(NOWAIT)、跳过锁定的数据(SKIP LOCKED)等选项来处理锁等待的情况。注意,上述设置仅在MySQL 8.4及更高版本才支持。
此外,可以为行锁设置超时时间。注意,MySQL不支持针对每个行锁实例设置超时时间,仅支持对所有的行锁设置超时时间,对应的参数是innodb_lock_wait_timeout。innodb_lock_wait_timeout 的默认值取决于 MySQL 版本。通常,默认值是 50 秒。这样的话,如果在指定时间范围内无法获取锁,获取锁的事务将返回一个错误,提示锁等待超时。

参考

https://blog.csdn.net/winy_lm/article/details/48175885 oracle for update和for update nowait的区别
https://docs.pingcode.com/baike/2033002 mysql数据库如何加行锁
https://dev.mysql.com/doc/refman/8.4/en/innodb-locking-reads.html Locking Reads
https://yiyan.baidu.com 文心一言

相关文章:

MySQL行锁的实践

在MySQL中,根据加锁的粒度,可以将数据库的锁细分为表锁、行锁、页锁。其中,表锁(Table Lock)是一种粗粒度的锁,它锁定整个表,阻止其他事务访问表中的任何行;行锁(Row Lock)是一种细粒度的锁,它锁…...

iOS 18 將在 9 月 16 日正式上線

現在有了正式的上線日期了。一如往常的,它會在 iPhone 16 系列正式推出前的 9 月 16 日先行上線。 iOS 18 最受矚目的無疑是它的 Apple Intelligence 功能,不過並非所有的 iPhone 機種都能享用,而是只有去年的 iPhone 15 Pro 和 Pro Max 才能…...

css选择器有几种?选择器的优先级是怎样的?

CSS选择器的主要分类 元素选择器(Type Selectors):选择HTML文档中的特定类型的元素。 示例:p { color: red; } 类选择器(Class Selectors):选择具有指定类名的元素。 示例:.myClass …...

果蔬识别系统性能优化之路(四)

目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路(三) 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印,发生其实初始化ivf的时间很快,慢的是数据在网络间的传…...

kafka之protobuf

Protobuf 的 .proto 文件是一种描述消息结构的定义文件,使用这种文件可以定义数据结构(消息),然后生成对应语言的类或代码用于序列化和反序列化数据。生成 .proto 文件涉及到编写 .proto 文件定义,然后通过 protoc 编译…...

BARTBERT

BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构: BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器(Encoder)模型,它使用了Transformer的编码器部分来处理输入的文本&#xff0…...

C++ 11新特性(1)

文章目录 C11新特性之auto和decltype知识点autoauto推导规则什么时候使用auto? decltypedecltype推导规则 auto和decltype的配合使用 C11新特性之左值引用、右值引用、移动语义、完美转发左值、右值纯右值、将亡值纯右值将亡值左值引用、右值引用 移动语义深拷贝、浅…...

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象,这个对象具有原对象属性的精确副本 基本数据类型(如字符串、数字等),在浅拷贝过程中它们是通过值传递的,而不是引用传递,修改值并不…...

Spring4-IoC2-基于注解管理bean

目录 开启组件扫描 使用注解定义bean Autowired注入 场景一:属性注入 场景二:set注入 场景三:构造方法注入 场景四:形参注入 场景五:只有一个构造函数,无注解 场景六:Autowired和Quali…...

AI基础 L22 Uncertainty over Time I 时间的不确定性

Time and Uncertainty 1 Time and Uncertainty States and Observations • discrete-time models: we view the world as a series of snapshots or time slices • the time interval ∆ between slices, we assume to be the same for every interval • Xt: denotes the se…...

中小型企业网络构建

1 什么是 VLAN? VLAN,指的是虚拟局域网,是一种 2 层技术。可以在交换机上实现广播域的隔离。从而可以减小 数据广播风暴对交换网络的影响,降低了网络管理难度,同时可以实现网络规模的灵活扩展。 2 Trunk 链路与 Acces…...

PXE服务

一.PXE服务的功能介绍 1.无盘启动:PXE允许计算机在没有本地存储设备的情况下启动操作系统。这对于构建无盘工作站非常有用,因为计算机可以直接从网络加载操作系统和其他应用程序1。 2.远程安装操作系统:PXE技术可以用于远程安装操作系统&…...

Docker技术深度解析与实践应用

Docker技术深度解析与实践应用 引言 在现代软件开发与部署的浪潮中,Docker作为一种轻量级的容器化技术,凭借其高效、一致和灵活的特性,逐渐成为云原生应用开发和部署的基石。本文将深入探讨Docker的核心概念、技术原理、实践应用&#xff0…...

链动321模式小程序开发源码

链动31模式概述 链动31模式是一种基于技术的新型商业模式,它通过激励用户分享和推广,实现用户、企业和平台的共赢。该模式通常涉及商品展示、积分系统、分享推广和排行榜等功能,旨在通过用户之间的社交裂变来扩大销售和品牌影响力。如何开发这…...

java开发中间件学习记录(持续更新中~)

1 Redis 2JVM 3 java基础底层 4Mysql 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1:Redis 1.穿透 1.1缓存穿透 1.1.1布隆过滤器 1.2缓存击穿 2:击穿 1.3:缓存雪崩 1.4:双写一致 1.5.持久化(RDB,AOF) 1.6…...

(批处理)无限弹窗cmd

代码部分 echo off echo 好了,可以退出了 pause>nul echo 再点就要无限弹窗了! pause >nul echo 你还点? pause >nul echo 再给你最后一次机会,别点了,再点准备重启 pause >nul echo 点击任意键变身奥特曼…...

解决ubuntu 24.04 ibus出现卡死、高延迟问题

问题描述 ubuntu中使用ibus经常会出现卡死、高延迟的问题,网上找了一些解决方法就手动输入命令是重启。但是键盘卡死了没法输入,不能很有效的解决问题。 解决思路 通过一个bash脚本监测ibus进程,当出现进程卡死的时候自动重启。 bash代码…...

减少脏页标记技术中处理时间的方法

减少脏页标记技术中处理时间的方法 一、引言 在数据库系统中,脏页标记技术对于确保数据的一致性和持久性至关重要。然而,脏页标记过程可能会消耗一定的处理时间,影响数据库的性能。因此,寻找有效的方法来减少脏页标记技术中的处理时间具有重要意义。 二、优化数据结构 …...

828华为云征文 | 华为云Flexusx与Docker技术融合,打造个性化WizNote服务

前言 华为云Flexus X实例携手Docker技术,创新融合打造高效个性化WizNote服务。华为云Flexus X实例的柔性算力与Docker的容器化优势相结合,实现资源灵活配置与性能优化,助力企业轻松构建稳定、高效的云端笔记平台。828华为云企业上云节特惠来袭…...

JavaScript事件处理和常用对象

文章目录 前言一、事件处理程序 1.JavaScript 常用事件2.事件处理程序的调用二、常用对象 1.Window 对象2.String 对象3.Date 对象总结 前言 JavaScript 语言是事件驱动型的。这意味着,该门语言可以通过事件触发来调用某一函数或者一段代码。该文还简单介绍了Window…...

Qt基础类05-尺寸类QSize

Qt基础类05-尺寸类QSize 摘要基本信息写在前面重要成员函数举例7个QSize QSize::boundedTo(const QSize &otherSize) constQSize QSize::expandedTo(const QSize &otherSize) constbool QSize::isEmpty() constbool QSize::isNull() constbool QSize::isValid() constQ…...

Vue 2中的this指向详解

在JavaScript中,this的指向是许多开发者经常遇到的问题,尤其是在使用Vue这样的框架时。在Vue 2中,理解this的指向对于正确地访问组件的数据和方法至关重要。 1. this在Vue组件中的指向 在Vue组件的选项中,this通常指向当前组件实…...

长业务事务的离线并发问题

事务指代一组操作同时成功或同时失败,事务可分为两类: 系统事务:即关系数据库事务,一次数据库连接中由start transaction或begin开启,commit表示提交,rollback表示回滚;业务事务:完…...

黑马程序员Java笔记整理(day01)

1.windowsR进入运行,输入cmd 2.环境变量 3.编写java第一步 4.使用idea 5.注释 6.字面量 7.变量 8.二进制 9.数据类型 10.关键词与标识符...

VMware Tools系列一:安装VMware Tools的作用

最近笔者安装了VMware Workstation pro 17,同时在VMware中安装了华为的Open Euler服务器,由于虚拟机Open Euler经常需要与宿主机win10交换数据,很不方便,而安装VMware Workstation pro 17并没有自动安装了VMware Tools &#xff0…...

使用大语言模型(LLM)修正小段乱码(Mojibake)为正常文本

Python方案 在上一篇文章ftfy:修正小段乱码(Mojibake)为正常文本的Python库中,我介绍了ftfy这个库。但随着持续的开发,我发现它仍然有一些解决不了的转换。如下: >>> ftfy.fix_text(‡›‘…...

C++ 访问限定符

个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 C一种实现封装的方式,用类将对象的属性与方法结合在一块&#xf…...

几种mfc140u.dll常见错误情况,以及mfc140u.dll文件修复的方法

如果你遇到与mfc140u.dll 文件相关的错误,这通常指的是该mfc140u.dll文件可能丢失、损坏或与您的应用程序不兼容。详细分析关于mfc140u.dll文件错误会对系统有什么影响,mfc140u.dll文件处于什么样的位置?以下是几种常见的错误情况及其修复方法…...

[产品管理-21]:NPDP新产品开发 - 19 - 产品设计与开发工具 - 详细设计与规格定义

目录 前言: 一、详细设计与规格定义概述 1、产品详细设计 2、规格定义 3、详细设计与规格定义的关系 4、实际应用中的注意事项 二、详细设计与规格定义主要工具 2.1 质量功能展开QFD - 需求跟踪矩阵 1、QFD的基本原理 2、QFD的实施步骤 3、QFD的优势与应…...

powershell@文件大小排序@文件夹磁盘占用分析

文章目录 abstractpowershell对于列出子目录大小的支持状况按文件大小排序指定目录下所有文件 扩展的专用函数介绍统计目录或文件的大小👺对指定目录以友好的格式列出所有文件和子目录的大小函数灵活性说明👺 综合用例其他相关软件易用系列 abstract 在…...