编程5年的老哥说:我代码里从来不用锁,谁爱...

技多不压身!

大家好,我是 javapub。

今天一个朋友找我吐槽,说自己平时在工作中几乎用不到需要上锁的场景,就算有也只是并发很小、或者直接从有业务设计上就规避掉了。但一到面试,都是各种锁题,很头疼。

面试造火箭的现象是这个行业的一个常态,而且掌握底层知识真的可以帮助我们更好的做好技术设计。所以,我劝他不要抵触,等学会的知识点多了融会贯通,学其他的东西也会快很多。

image-20240527184946810

2.1 共享锁/排它锁

共享锁(S锁)和排它锁(X锁)是最基础的锁类型,用于操作对数据的读取和写入。

通过名字,我们也可以看出这两个锁的作用。当事务要读取一条记录时,先获取该记录的S锁;当事务要改动一条记录时,先获取该记录的X锁。

img

通过这个图可以知道,什么情况下可以获得 S 锁和 X 锁。可以看到,只有都是共享锁时,才可以同时在一行记录加锁。

例子:

加共享锁,共享锁允许其他事务读取这些行,但不允许其他事务修改或删除这些行,直到当前事务结束。

SELECT ... LOCK IN SHARE MODE; 加共享锁
---
SELECT * FROM user WHERE id=1 LOCK IN SHARE MODE;

加排他锁,相当于是独占记录。当一个事务对某行数据加上排他锁后,其他事务既不能读取也不能修改这些数据,直到持有排他锁的事务结束。

SELECT ... FOR UPDATE; 加排他锁
---
START TRANSACTION;
SELECT * FROM table_name WHERE condition FOR UPDATE;
-- 执行一些更新操作
UPDATE table_name SET column = value WHERE condition;
COMMIT;
2.2 行锁/临键锁

行锁

行锁通常在执行涉及单个行的操作时自动应用,例如 SELECT 语句中的 FOR UPDATE 子句,这会为查询结果中的每行添加排他锁。也就是上面说到的例子。

START TRANSACTION;
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
-- 在此事务中,id为1的行将被锁定,其他事务不能修改或读取这行
COMMIT;

临键锁

临键锁结合了记录锁和间隙锁,用于行级锁定和范围查询,防止幻读。我们一般无法判断是行锁还是临键锁,都是行锁的形式,由存储引擎在执行查询时自动管理决定的。

START TRANSACTION;
SELECT * FROM table_name WHERE id BETWEEN 1 AND 10 FOR UPDATE;
-- 这将锁定id在1到10之间的所有行,以及可能的下一个键值
COMMIT;
2.3 意向锁

意向锁是针对多粒度锁定协议的系统,比如行粒度锁、表粒度锁。当一个事务打算在某个细粒度上请求锁(共享锁|排他锁),它会首先在更粗力度上设置意向锁。

意向共识锁 - 简称 IS

意向排他锁 - 简称 IX

例子:如果一个事务要对一张表加排他锁,它会先在表级别加上意向排他锁,然后对表中的特定行加排他锁。

img

2.4 间隙锁/插入意向锁

间隙锁和插入意向锁针对实现了多版本并发控制(MVCC)的系统中,如 MySQL 的 InnoDB 存储引擎。

间隙锁(Gap Locks):

间隙锁是一种行锁,它锁定一个范围内的间隙,但不锁定该范围内的任何具体行。间隙锁主要用于防止其他事务在这个间隙中插入新的行,从而维护数据的顺序性和一致性。
间隙锁通常在执行范围查询并加上共享或排他锁时自动应用。例如,如果一个事务执行了 SELECT ... WHERE index_column BETWEEN x AND y LOCK IN SHARE MODE ,InnoDB 会在索引列 x 和 y 之间的间隙上设置间隙锁,防止其他事务在这个范围内插入新行。

示例:

START TRANSACTION;
SELECT * FROM table_name WHERE id BETWEEN 10 AND 20 LOCK IN SHARE MODE;
-- 在id为10到20的范围内设置间隙锁
COMMIT;

插入意向锁(Insert Intention Locks):

插入意向锁是一种特殊的间隙锁,它表明一个事务有意向在某个间隙中插入新行。
当一个事务想要在一个已经被其他事务加上间隙锁的范围内插入新行时,它会首先在该范围内设置一个插入意向锁。

插入意向锁允许多个事务保留在特定间隙中插入新行的意图,而不直接与间隙锁冲突。这样,当间隙锁被释放时,持有插入意向锁的事务可以继续执行插入操作。

示例:

START TRANSACTION;
-- 假设另一个事务已经在id为10到20的范围内设置了间隙锁
SELECT * FROM table_name WHERE id = 15 FOR UPDATE;
-- 这将设置一个插入意向锁,表明事务有意向在id为10到20的范围内插入新行
COMMIT;
2.5 自增锁

自增锁(Auto-Increment Locks,简称:AI Locks)是MySQL数据库中InnoDB存储引擎特有的一种锁机制,它与自增字段(AUTO_INCREMENT)相关联。AUTO_INCREMENT 你一定不陌生,我们在建表时多数情况都会让主键 id 自增来生成唯一序列。

当一个表中包含自增字段时,InnoDB 会使用自增锁来确保在并发环境下,自增字段生成的值是唯一的,并且连续的。

示例:

START TRANSACTION;
INSERT INTO table_name (auto_increment_column, other_columns) VALUES (NULL, 'value1');
-- InnoDB分配自增值并锁定它
COMMIT;
-- 自增锁在事务提交时释放

在这个示例中,auto_increment_column 是一个自增字段。当事务提交时,InnoDB 会分配一个新的自增值给插入的行,并在事务提交时释放自增锁。

2.6 外键锁

外键(Foreign Key)是一种数据库完整性约束,它用于维护两个表之间的链接,并确保引用的数据的完整性。

外键锁顾名思义就是针对外键的。外键锁并不是一个标准的锁类型,而是指与外键约束相关的锁定行为,这些行为确保在执行涉及外键的插入或更新操作时,数据库的完整性不被破坏。

外键锁这个术语并不是用来描述一种特定的锁类型,而是用来描述与外键约束相关的锁定行为。数据库系统会自动处理这些锁定,以确保数据的完整性和一致性。

2.7 表锁/页锁

表锁和页锁是两种不同粒度的锁,

表锁(Table Locks)

表锁是锁定整个表的锁,这意味着在锁定期间,没有其他事务可以对这张表进行读写操作。表锁通常用于批量操作,如全表扫描或全表更新,以及在不需要频繁锁定和解锁单个行的场景中。

特点:

  • 粒度较大:表锁影响整个表的所有数据,因此粒度较大。
  • 冲突较少:由于锁定了整个表,减少了锁冲突的可能性,但在高并发环境下可能导致其他事务长时间等待。
  • 使用场景:适用于全表操作,如全表备份或全表删除。

示例:

LOCK TABLES table_name WRITE;
-- 在此期间,其他事务不能访问table_name
UNLOCK TABLES;

页锁(Page Locks)

页锁是锁定数据库中的一个“页”的锁。在许多数据库系统中,数据是按页存储的,每页包含一定数量的行。页锁允许多个事务同时访问不同的页,从而提供比表锁更细粒度的并发控制。

特点:

  • 粒度较小:页锁锁定的是数据页,而不是整个表,因此粒度较小。
  • 并发性更好:允许多个事务并发访问不同的数据页,提高了并发性能。
  • 使用场景:适用于需要较高并发性能的场景,尤其是在大型表上进行部分数据的读写操作。

注意:页锁通常由数据库管理系统自动管理,不需要用户显式操作。例如,在InnoDB存储引擎中,虽然页锁不是用户可以直接控制的锁类型,但InnoDB会根据需要自动在页级别上应用锁。

总结: 粒度:行锁 < 页锁 < 表锁(从细到粗)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈JMeter运行原理

浅谈JMeter运行原理 JMeter架构基础 JMeter基于Java平台开发&#xff0c;运行于Java虚拟机&#xff08;JVM&#xff09;之上。这意味着它可以在任何支持JVM的操作系统上运行&#xff0c;包括Windows、Linux、macOS等。其核心架构设计围绕着多线程执行机制&#xff0c;这使得它…

Android 13 高通设备热点低功耗模式

需求: Android设备开启热点,使Iphone设备连接,自动开启低数据模式 低数据模式: 低数据模式是一种在移动网络或Wi-Fi环境下,通过限制应用程序的数据使用、降低数据传输速率或禁用某些后台操作来减少数据流量消耗的优化模式。 这种模式主要用于节省数据流量费用,特别是…

spring boot 项目配置支持https

前言 本地的项目接口 需要支持https访问 准备 java环境 由于我们使用的是java自带的 keytool工具java 生成根证书 环境是必须的 实战 生成 https证书# alias 别名 keystore 存储文件名称 storepass 存储密码 validity 有效期&#xff08;天数&#xff09; keytool -genk…

4---git命令详解第一部分

一、提交文件方面命令&#xff1a; 1.1第一步&#xff1a;将需要提交的文件放进暂存区&#xff1a; 添加单个文件到暂存区stage&#xff1a; git add 文件名 添加多个文件到暂存区&#xff1a; git add 文件名1 文件名2 ... 将目录下所有文件添加到暂存区&#xff1a; git…

Pushmall共享分销电商SaaS版2024年 5月模块开发优化完成

Pushmall共享分销电商 2024年 5月模块开发优化完成 1、**实现SaaS框架业务&#xff1a;**多租户、多商家、多门店&#xff0c;及商家入驻、商品管理。 2、租户小程序管理&#xff1a;对租户的小程序业务管理。 3、店铺小程序管理&#xff1a;对租户多店铺小程序绑定。 4、会员分…

记录一次开源 MaxKey 安装部署

官方文档&#xff1a;https://www.maxkey.top/doc/docs/intro/ 开源代码&#xff1a;https://toscode.mulanos.cn/dromara/MaxKey 发行版&#xff1a;https://toscode.mulanos.cn/dromara/MaxKey/releases 一、准备工作 yum install -y yum-utils yum-config-manager --add-r…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(八)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 现在&#xff0c;我们…

【Linux】使用 s3fs 挂载 MinIO 桶

s3fs&#xff08;S3 File System&#xff09;是一个基于FUSE&#xff08;Filesystem in Userspace&#xff09;的用户空间文件系统&#xff0c;可以将Amazon S3存储桶挂载到本地文件系统。通过s3fs&#xff0c;我们可以像操作本地文件一样&#xff0c;对S3存储桶中的数据进行读…

走进全球LED显示龙头艾比森,深挖逆势增长43%的数智化逻辑

在大环境不景气的情况下&#xff0c;有一家智能制造企业在2023年营收40亿&#xff0c;同比增长高达43%&#xff0c;海外营收增长约 46%&#xff0c;并且连续12年单品牌出口额第一。 这就是全球LED显示龙头艾比森。 5月9日&#xff0c;纷享销客带领近70位企业高管走进纷享销客…

pinia持久化未生效

pinia官方文档 https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/ pinia持久化未生效的原因很有可能就是在main.js中重复创建了pinia&#xff0c;导致持久化未生效

成都蓝蛙科技引领AIGC创新,亮相中国AIGC开发者大会

2024年5月25日&#xff0c;第三届AIGC中国开发者大会在北京举行&#xff0c;蓝蛙科技公司CEO兼创始人李辰受邀出席并发表主题演讲。作为开源框架GeneralAgent的作者&#xff0c;发表了题为“Agent框架的挑战和解决方案”的精彩演讲。李辰先生深入探讨了在构建和部署基于大型语言…

卷径计算(PID输出补偿法 SCL源代码)

卷径计算有很多方法,这里我们提供另一个思路,这里我们采用的是通过速度控制间接控制张力通过线速度和系统卷径我们可以计算出我们的速度前馈量(主速度)。具体收放卷前馈量计算可以参考下面文章链接: 收放卷前馈量计算FC(梯形图+SCL代码)-CSDN博客文章浏览阅读584次。这篇博…

2024最新TikTok抖音国际版,tiktok正版免拔卡安装来了!

保姆级教程&#xff01;2024最新TikTok抖音国际版&#xff0c;无限制&#xff01;tiktok正版免拔卡安装方法来了&#xff01; TikTok这款APP为何让全球都为之疯狂&#xff1f;因为它更懂人性&#xff0c;懂的人都懂&#xff01; 我是你的老朋友阿星&#xff0c;今天阿星要给大…

Maven高级详解

文章目录 一、分模块开发与设计分模块开发的意义模块拆分原则 分模块开发(模块拆分)创建Maven模块书写模块代码通过maven指令安装模块到本地仓库(install指令) 二、依赖管理依赖传递可选依赖排除依赖可选依赖和排除依赖的区别 三、聚合与继承聚合工程聚合工程开发创建Maven模块…

香橙派OrangePi AIpro,助力国产AIoT迈向新的台阶!

前言&#xff1a;很高兴受邀CSDN与OrangePi官方组织的测评活动&#xff0c;本次测评是一块基于AI边缘计算的香橙派开发板OrangePi AIpro。这是 香橙派 联合 华为昇腾 合作精心打造的新一代边缘AI计算产品&#xff0c;于2023年12月初发布&#xff0c;提供 8/20TOPS澎湃算力[1]&a…

关于Java程序入口args参数

关于Java程序入口args参数 我们都知道一个java工程会有一个主程序入口&#xff0c;即我们常见到的如下代码 public static void main(String[] args) {// 中间程序 }但是很多人可能都不知道主程序入口中的String[] args后面的args会有怎么样一个使用场景呢&#xff1f; 其实在…

【chagpt】广泛使用API之前:考虑成本和数据隐私

文章目录 一. 定价和标记限制二. 安全和隐私 在广泛使用API之前&#xff0c;应该考虑两个重要因素&#xff1a;成本和数据隐私。 一. 定价和标记限制 OpenAI在Pricing页面上列出了模型的定价。请注意&#xff0c;OpenAI不一定及时更新该页面上的定价信息&#xff0c;因此实际…

Rust 赋能前端 -- 写一个 File 转 Img 的功能

所有耀眼的成绩,都需要苦熬,熬得过,出众;熬不过,出局 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 Rustwasm-bindgen/js-sys/web-sysWeb WorkerWebAssemblyWebpack/Vite配置WebAssemblyOffscreenCanvas脚手架生成项…

[AI Google] I/O 2024大会上我们宣布的100件事情

I/O 2024 发生了很多事情&#xff01;无论你对最新的 Gemini 应用更新感兴趣&#xff0c;对开发者即将推出的内容感到特别兴奋&#xff0c;还是迫不及待想尝试最新的生成式 AI 工具&#xff0c;这里几乎为每个人都提供了一些内容。不信&#xff1f;以下是我们在过去两天宣布的 …

如何使用 Monte Carlo 模拟作为项目管理工具

Monte Carlo 模拟是一种预测不确定事件可能结果的数学技术。我们之前曾撰写过有关其为研发专业人员带来的益处的文章&#xff0c;并主持过有关 Monte Carlo 模拟功能的网络讲座&#xff0c;以帮助产品满足预期规格、预测过程能力并确定最佳过程设置。然而&#xff0c;Monte …