一文理解MySQL的For Update行级锁

news2024/11/15 10:23:10

一文理解MySQL的For Update行级锁

  • 引言
  • 一、MySQL的For Update简介
    • 1.1、For Update的作用
    • 1.2、For Update与其他锁定方式的区别
  • 二、For Update的语法
  • 2.1、SELECT语句的基本语法
    • 2.2、mysql如何开启事务和提交事务?
    • 2.3、使用For Update进行数据锁定
  • 三、如何使用For Update
    • 3.1、For Update的应用场景
    • 3.2、使用案例分析
  • 四、For Update的注意事项
    • 4.1、For Update的局限性
    • 4.2、不当使用For Update可能导致的问题
    • 4.3、For Update一定只锁行吗?
  • 五、总结
    • 5.1、理解For Update的优缺点
    • 5.2、合理使用For Update,提升数据库性能

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


一、MySQL的For Update简介

For update是MySQL中用于实现行锁的一种语法,其主要作用是在SELECT查询语句中加上FOR UPDATE子句,以保证查询结果集中的每一行都被锁定,避免其他事务对这些行进行修改。具体语法如下:

SELECT ... FROM table_name WHERE ... FOR UPDATE;

在执行For update语句时,MySQL会首先获取表级共享锁,然后再根据WHERE条件锁定符合条件的行。锁定的范围包括了WHERE条件筛选出来的所有行,即使有些行并不满足WHERE条件。

需要注意的是,For update语句会将锁定的行一直锁定到事务结束,因此在使用时需要考虑是否会导致死锁的问题,并尽量缩小锁定的范围。同时,对于InnoDB存储引擎的表,可以使用行级锁和间隙锁来提高并发性能。

1.1、For Update的作用

"For Update"是一种SQL语句,它的作用是在查询过程中锁定数据行,防止其他事务对这些数据进行修改操作。使用"For Update"可以保证当前事务对被锁定的数据具有排他性,并且能够避免产生并发问题。"For Update"适用于需要修改或者删除数据的场景,例如在一个订单系统中,如果多个用户同时尝试对同一个订单进行修改操作,就可以使用"For Update"方式来避免冲突。

1.2、For Update与其他锁定方式的区别

  1. For Update是一种排它锁定方式,只有被锁定的行才能进行修改操作。而共享锁定方式允许多个事务同时读取同一行数据,但是不允许对其进行修改。
  2. For Update锁定方式可以避免出现脏读、不可重复读和幻读等并发问题,因为它会在读取某一行数据时将其锁定,直到事务结束或提交之前才释放锁定。
  3. For Update锁定方式可能会导致死锁问题,因为多个事务可能会互相等待对方释放锁定。而其他锁定方式如共享锁定则不存在这个问题。
  4. For Update锁定方式的性能较差,因为它需要在读取数据时进行锁定操作,增加了系统的开销。而其他锁定方式如共享锁定则没有这个问题。

二、For Update的语法

2.1、SELECT语句的基本语法

SELECT column1, column2, ... FROM table_name WHERE condition;

其中,column1、column2等为要查询的列名,用逗号分隔;table_name为要查询的表名;condition为查询条件,可选。

2.2、mysql如何开启事务和提交事务?

MySQL中使用START TRANSACTION命令来开启一个事务,使用COMMIT命令来提交事务。开启事务后,在数据库中所做的所有更改都不会立即写入磁盘,而是被缓存到内存中。只有在事务提交时,这些更改才会被保存到磁盘上。

下面是一个简单的示例,演示如何开启并提交一个事务:

-- 开启事务
START TRANSACTION;

-- 执行一系列SQL语句,对数据进行修改
INSERT INTO my_table (col1, col2) VALUES ('value1', 'value2');
UPDATE my_table SET col3 = 'new_value' WHERE col1 = 'value1';

-- 提交事务
COMMIT;

使用START TRANSACTION命令开启了一个事务,并在之后执行了一系列对数据进行修改的SQL语句。最后使用COMMIT命令提交了事务,从而将所有的修改操作保存到了磁盘上。

如果需要取消事务所做的修改操作,可以使用ROLLBACK命令来回滚事务。例如:

-- 开启事务
START TRANSACTION;

-- 执行一系列SQL语句,对数据进行修改
INSERT INTO my_table (col1, col2) VALUES ('value1', 'value2');
UPDATE my_table SET col3 = 'new_value' WHERE col1 = 'value1';

-- 回滚事务
ROLLBACK;

在上述示例中,使用ROLLBACK命令回滚了事务,从而取消了所有已经执行的修改操作。

2.3、使用For Update进行数据锁定

使用For Update需要注意以下几点:

  1. For Update只能应用于SELECT语句中。
  2. 对于使用了For Update的SELECT语句,只有当事务提交或回滚时,所加的锁才会被释放。
  3. 在使用For Update时,要确保事务的隔离级别为Serializable级别,因为只有这个级别能够保证数据的完整性和一致性。

下面是一个使用For Update进行数据锁定的示例:

START TRANSACTION;

SELECT * FROM table_name WHERE id = 1 FOR UPDATE;

UPDATE table_name SET column_name = 'new_value' WHERE id = 1;

COMMIT;

先使用SELECT语句来选取待更新的行,并在其后添加FOR UPDATE关键字,从而将该行数据进行锁定。然后再执行UPDATE语句来更新该行数据。最后通过COMMIT确认事务完成,从而释放锁定。

三、如何使用For Update

3.1、For Update的应用场景

  1. 数据库更新:当数据库中某些记录需要进行修改、删除或插入时,可以使用For Update锁定这些记录,以确保数据操作的正确性和一致性。
  2. 并发控制:在并发访问情况下,多个线程可能会同时读取和写入同一份数据,使用For Update可以避免并发问题,保证数据的完整性和准确性。
  3. 事务处理:在事务中,For Update可以确保对共享资源的互斥访问,防止出现数据不一致的情况。
    缓存更新:使用For Update可以在缓存中更新数据,保证在多个进程或线程中操作缓存时的数据一致性。
  4. 悲观锁控制:For Update是一种悲观锁控制方法,可以确保在对共享资源进行操作前,先将其锁定,以防止其他线程对其修改。

3.2、使用案例分析

(1)并发读取和更新操作。

假设有一个银行账户表,其中包含账户余额。为了保证并发操作在更新账户余额时不会出现问题,可以使用FOR UPDATE语句锁定数据行。

例如,以下SQL查询会对指定的账户进行锁定:

SELECT balance FROM accounts WHERE account_number = '12345' FOR UPDATE;

这将锁定具有帐户号码“12345”的帐户行,并且在事务提交之前,其他事务将无法修改该行。接下来,可以更新余额,例如:

UPDATE accounts SET balance = balance - 100 WHERE account_number = '12345';

在此示例中,“12345”账户的余额将被减少100元。在提交事务之后,其他事务才有机会访问该行并进行更新。

(2)多个事务同时访问同一条记录。

使用For Update语句可以在多个事务同时访问同一条记录时实现加锁,保证数据的一致性。

在MySQL中,For Update语句可以在SELECT语句中使用,如:

SELECT * FROM table_name WHERE id=1 FOR UPDATE;

这条语句会锁定id为1的记录,其他事务需要等待该事务释放锁才能对该记录进行操作。

当有多个事务同时访问同一条记录时,只有一个事务能够获得锁,其他事务需要等待。如果获得锁的事务没有及时释放锁,则其他事务可能会发生死锁现象。

需要注意的是,在使用For Update语句时应尽量控制事务的范围,避免锁定过多的记录,影响数据库的并发性能。

(3)防止脏读取和不可重复读取。

假设有一个银行账户表,其中包含账户名、余额和最近更新时间这三个字段。现在需要对某个账户进行转账操作,并且要求转账过程中不能出现脏读取和不可重复读取的情况。

使用For Update可以实现这一要求。For Update是MySQL提供的一种行级锁定机制,它可以锁定查询结果集中的指定行,从而避免其他事务对这些行进行修改或删除操作。

下面是一个示例代码,假设要将账户A中的100元转账给账户B:

START TRANSACTION;

SELECT balance FROM accounts WHERE account_name = 'A' FOR UPDATE;

UPDATE accounts SET balance = balance - 100 WHERE account_name = 'A';
UPDATE accounts SET balance = balance + 100 WHERE account_name = 'B';

COMMIT;

在上述代码中,首先使用SELECT语句查询账户A的余额,并使用FOR UPDATE子句对其进行锁定。这意味着在当前事务未提交之前,其他事务无法对账户A的余额进行修改或删除操作,从而避免了脏读取和不可重复读取的情况。接下来,使用两个UPDATE语句分别将账户A的余额减少100元,将账户B的余额增加100元,并在最后进行事务提交。

需要注意的是,使用For Update会对性能产生一定的影响,因此应该谨慎使用。在实际应用中,可以根据具体情况进行优化和调整。

四、For Update的注意事项

4.1、For Update的局限性

For Update虽然可以解决部分并发问题,但也存在一定的局限性。

  1. For Update只能用于InnoDB引擎。如果使用MyISAM等其他引擎,无法使用For Update。
  2. For Update会对查询结果集中的行进行锁定,这意味着其他事务无法对这些行进行修改或删除操作。如果锁定时间过长,可能会导致其他事务出现阻塞,从而影响系统的并发性能。
  3. 如果在一个事务中多次使用For Update语句锁定同一行,则后面的For Update语句可能会被前面的For Update语句所覆盖。因此,在使用For Update时应该谨慎考虑锁定的粒度,尽量避免对同一行进行多次锁定操作。
  4. 在MySQL 8.0版本之前,For Update只能锁定整个表、整个分区或整个索引。如果要锁定某个特定的行,需要使用WHERE子句来指定条件。但是,这种方式会增加锁定的粒度,可能会导致更多的阻塞和性能问题。

4.2、不当使用For Update可能导致的问题

  1. 死锁:如果多个事务同时使用For Update锁定相同的资源,可能会导致死锁。
  2. 性能问题:使用For Update会锁定相应的行,这可能会影响并发性和性能。
  3. 数据一致性问题:在事务中使用For Update锁定行时,如果在锁定期间其他事务对相同的数据进行了更新,则当前事务可能会读取到已过时的数据。
  4. 阻塞问题:如果一个事务长时间持有For Update锁,其他事务将无法访问相应的资源,这可能会导致阻塞问题。
  5. 安全问题:当使用For Update时,必须小心不要将代码中的所有查询都添加上锁,否则可能会导致安全问题。例如,如果一个查询返回敏感信息,但未加锁,则可能会导致信息泄漏。

4.3、For Update一定只锁行吗?

MySQL的FOR UPDATE语句只会对查询结果集中的行进行行锁,其他事务无法修改被锁定的行。但需要注意的是,在多表查询时,如果没有正确地使用JOIN操作或者没有设置正确的索引,可能会导致表级锁定而不是行级锁定。

比如有两个表A和B,A表中有id和name字段,B表中有id和age字段。现在要查询A表中所有名字为“Tom”的记录,并更新对应的B表中的年龄。

如果使用如下的SQL语句:

SELECT * FROM A WHERE name = 'Tom' FOR UPDATE;
UPDATE B SET age = 30 WHERE id = ?;

如果A表中的name字段没有索引,那么MySQL就会对整个A表进行表级锁定,而不是对查询结果集中的行进行行级锁定。这样,即使只有一条记录满足条件,也会导致其他事务无法访问A表,从而影响系统的并发性能。因此,在使用FOR UPDATE时,需要注意表的索引情况,尽量避免表级锁定的出现。

五、总结

5.1、理解For Update的优缺点

For Update是一种SQL语句,用于锁定指定的行或表,以保证在事务中其他用户不能修改这些数据。

优点:

  1. 数据的完整性:使用For Update可以避免并发操作导致数据不一致的问题。
  2. 提高效率:通过锁定数据,可以减少多个事务同时对同一行数据进行修改的情况,从而提高了查询和更新的效率。
  3. 简化代码:通过使用For Update,开发人员可以简化代码,并减少手动处理并发操作带来的风险。

缺点:

  1. 并发性降低:使用For Update会阻塞其他事务对锁定的数据进行修改,因此可能会导致并发性降低。
  2. 死锁风险:如果多个事务之间互相等待对方释放锁,则可能会出现死锁的情况。
  3. 内存开销:For Update需要占用一定的内存资源,当并发量很大时,可能会占用更多的内存资源,从而影响系统的稳定性。

5.2、合理使用For Update,提升数据库性能

For Update是一种数据库锁定机制,用来保护数据的一致性和完整性。在进行修改操作时,For Update会锁定相应记录,防止其他事务同时修改同一条数据造成数据不一致。

合理使用For Update可以提升数据库性能,主要表现在以下几个方面:

  1. 减少数据库死锁情况:使用For Update可以有效地避免多个事务同时对同一条数据进行修改而造成的死锁问题。
  2. 提高并发处理能力:For Update只会锁定相应的记录,而不是整个表,因此可以在保证数据一致性的前提下支持更多的并发操作。
  3. 缩短事务执行时间:使用For Update可以减少事务的回滚次数,缩短事务的执行时间,从而提升数据库的性能。

但是,过度使用For Update也会带来一些副作用,如增加数据库的锁定和等待时间、降低数据库的并发处理能力等。因此,在使用For Update时需要根据具体情况进行合理的优化和调整。
在这里插入图片描述

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

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

相关文章

王道计算机网络学习笔记(2)——物理层

前言 文章中的内容来自B站王道考研计算机网络课程,想要完整学习的可以到B站官方看完整版。 二:物理层 2.1.1:物理层基本概念 2.1.2:数据通信基本知识 1、数据通信模型和基本概念 通信目的是为了传递消息(消息&…

2022 年第十二届 MathorCup 高校数学建模挑战赛D题思路(移动通信网络站址规划和区域聚类问题)

目录 一、前言 二、问题背景 三、问题 四、解题思路 (1)针对问题1: (2)针对问题2: (3)针对问题3: 五、附上几个典型代码 (1)K-means算法…

6月16日,企业快成长技术创新论坛厦门站大数据专场开启!

全球大数据规模增长快速,2020年全球新增数据规模为64ZB,是2016年的400%,2035年新增数据将高达2140ZB1,大数据呈现指数级增长。随着数字经济的发展和数字化转型的深入,愈来愈多的数据资源正以数据要素的形态独立存在并参…

STM32F4_DS18B20红外温度传感器

目录 前言 1. 单总线时序结构 2. DS18B20结构 2.1 DS18B20操作流程 2.2 DS18B20数据帧 3. 温度存储格式 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DS18B20.c 5.3 DS18B20.h 前言 STM32F4内部集成了温度传感器。在之前的学习中,我们已经学习了使用AD进…

宁波天一永安杯初赛 wp-AGCTS战队

文章目录 MISCZipSimpleDocumentBeautifulImage WebDeserializationCodeCheck CryptoSecretRsa MobilePeacock pwnwingtip REPolenta MISC Zip ARCHPR 直接数字爆破,得到二进制密码,得 flag SimpleDocument Kali binwalk 发现里面有一 pdf 文件&#…

DRIFTINGBLUES: 3实战演练

文章目录 DRIFTINGBLUES: 3实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、访问网页4、翻译内容5、访问网页6、翻译内容8、查看源码9、解密10、访问网页11、写入shell并登录12、连接shell13、查找nc14、反弹shell 三、后渗透1、进入家目录查找文件2、写…

分布式应用 ----- 点对点(p2p)网络

目录 1. 概述 1.1. P2P的概念 1.2. P2P产生的背景 1.3. P2P的优劣势 2. P2P分类 2.1. 根据中央化程度 2.2. 根据网络拓扑结构 3. NAT技术详解 3.1. 概述 3.2. NAT的优劣势 3.3. NAT穿透常见解决方案 3.4. 探针打洞基本原理 3.4.1. 基本原理 3.4.2. 同一个NAT网关内…

2023年企业云盘排行榜,这些产品值得尝试!

在当今信息技术高度发达的时代,企业对于信息的存储和管理需求越来越高。因此,企业云盘逐渐成为了企业存储与管理的重要组成部分。企业云盘能够实现多设备共享、远程控制、安全备份、合作办公等多种功能,方便高效地解决企业内部信息管理问题。…

【AIGC】17、MM-OVOD | 同时使用文本示例和图像示例来指导分类

文章目录 一、背景二、方法2.1 框架总览2.1.1 Text-based classifiers from language descriptions2.1.2 Vision-based Classifiers from Image Exemplars2.1.3 Constructing Classifiers via Multi-Modal Fusion 三、效果3.1 数据集3.2 实现细节3.3 开集目标检测结果 论文&…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(2)SOGI_PLL学习仿真总结

目录 前言 SOGI基本原理 锁相环基本原理 仿真实现及说明 总结 前言 前面总结了双向交错CCM图腾柱无桥单相PFC系统实现,后面把问题细分,关于SOGI锁相环的应用和学习在这里总结下。 双向交错CCM图腾柱无桥单相PFC学习仿真与实现(1&#x…

Collection接口详细介绍(下)

前言: 本篇文章主要讲解Java中的Collection接口以及相关实现类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了&#x1f601…

CSDN 周赛 59 期

CSDN 周赛 59 期 前言判断题单选题题目1题目2填空题编程题1、题目名称:坏掉的打字机2、题目名称:布尔零点计数小结前言 由于最近,csdn 每日一练新增了两个题目,按照惯例,那么新增的题目,会就近出现在最近的 CSDN 周赛中,嗯,经常参加周赛,并关注每日一练社区的小伙伴应…

51单片机一个TIMER输出6个PWM

51单片机的timer很少,往往16bit的timer只有一个,可以硬件输出的channel也不多。如我手上这就是这个情况,timer1, 16bit, 只有三个通道。我想输出6个pwm,这个就无法硬件的方式了。只能使用软件模拟了。pwm是1-20ms一个周期&#xf…

Thinking in Java第四版2.8注释和嵌入式文档

文章目录 前言一、注释风格1.单行注释2.多行注释 二、语法三、标签总结 前言 Java8官方在线文档 文档描述对每个系统来说都是必备且重要的,这里将介绍一些javadoc标签,以便加深对文档的理解和编写等。 一、注释风格 1.单行注释 单行注释以一个//起头&a…

JavaWeb之tomcarHTTP

1 DOM4j Xml解析 1.1 JAXP  JDK内置,不需要导入第三方jar包,简单工具优先选择。  支持两种解析方式:DOM、SAX 1.1.1 JAXP—DOM 加载xml 生成一个DOM树。获得整个文档的描述对象Document 解析 api 获得工厂 DocumentBuilderFactory –》 …

【MySql】MySql的事务基础篇

文章目录 CURD加控制什么是事物为什么会出现事务事务的版本支持事务的提交方式 CURD加控制 模拟一个买票系统的场景如下所示: MySQL注定会被多个客户端进行访问的,这个是肯定的,存储的都是数据,数据在上层可能有一个线程在用&…

C++17

目录 基本语言特性结构化绑定if和switch初始化器 std::string_view属性[[nodiscard]][[maybe_unused]][[fallthrough]] 模板特性新的标准库组件std::optional<>std::variant<>std::anystd::bytestd::as_const 文件系统库零星新特性 基本语言特性 结构化绑定 概念…

ubuntu安装WPS2019以及解决缺少字体问题

环境&#xff1a;ubuntu22.04.2 LTS 步骤&#xff1a; 1.去官网下载最新的WPS&#xff0c;官网地址如下&#xff1a;WPS Office 2019 for Linux-支持多版本下载_WPS官方网站 2.sudo dpkg -i 安装包.deb 3.安装完成&#xff0c;首次用WPS打开某个文档&#xff0c;会出现如下报…

硬件入门之什么是三极管

硬件入门之什么是三极管 文章目录 硬件入门之什么是三极管一、三极管是什么&#xff1f;&#xff08;百度百科&#xff09;三极管的3种工作状态分别是截止状态、放大状态、饱和状态 二、实际应用场景1.放大电路 &#xff08;放大状态&#xff09;2、开关电路&#xff08;截至状…

【聚类算法】谱聚类spectral clustering

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 说明&#xff1a; 后续增补 1. 正文 1.1 整体理解 谱聚类&#xff08;Spectral Clustering&#xff09;是一种基于图论的聚类方法&#xff0c;将带权无…