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

编程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会根据需要自动在页级别上应用锁。

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

相关文章:

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

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

CogAgent:开创性的VLM在GUI理解和自动化任务中的突破

尽管LLMs如ChatGPT在撰写电子邮件等任务上能够提供帮助&#xff0c;它们在理解和与GUIs交互方面存在挑战&#xff0c;这限制了它们在提高自动化水平方面的潜力。数字世界中的自主代理是许多现代人梦寐以求的理想助手。这些代理能够根据用户输入的任务描述自动完成如在线预订票务…...

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…...

《Ai学习笔记》自然语言处理 (Natural Language Processing):常见机器阅读理解模型(上)02

Glove 词向量&#xff1a; 在机器理解中的词的表示&#xff1a; 词袋&#xff08;bow,bag of words&#xff09; one-hot 词向量 word2vec glove 目的&#xff1a;将一个词转换成一个向量 Word2vec 是一种用于生成词向量的工具包&#xff0c;由Google在2013年开源推出…...

老师如何在线发布期末考试成绩查询?

在这个数字化时代&#xff0c;教育领域也迎来了翻天覆地的变化。传统的纸质成绩查询方式已经逐渐被在线成绩查询所替代。如何高效、便捷地进行在线期末考试成绩查询&#xff1f; 成绩的录入与上传。教师需要将学生的考试成绩准确无误地录入系统。这一步骤需要细心和耐心&#x…...

TensorBoard相关学习

TensorBoard是Google为TensorFlow框架开发的一个强大的可视化工具&#xff0c;它可以帮助用户更直观地理解、分析和调试机器学习模型的训练过程。通过TensorBoard&#xff0c;你可以可视化模型的结构、监控训练过程中的指标变化&#xff08;如损失函数、准确率&#xff09;、查…...

敏感数据处理的艺术:安全高效的数据提取实践与挑战

在数字化时代&#xff0c;数据已成为驱动经济社会发展的核心要素之一。然而&#xff0c;伴随数据量的爆炸性增长&#xff0c;敏感数据的管理和保护成为了信息安全领域的重大挑战。敏感数据&#xff0c;包括个人身份信息、财务记录、健康档案、商业秘密等&#xff0c;一旦泄露&a…...

使用Python操作excel单元格——获取带公式单元格的值

一、前言 通过使用Python的openpyxl库&#xff0c;来操作excel单元格&#xff0c;获取带公式的单元格中的值。 把学习的过程分享给大家。大佬勿喷&#xff01; 二、程序展示 1、表格准备 使用前面创建过的表格&#xff0c;获取B6单元格的求和值。 2、获取表格的值 wb o…...

PHP开发入门

PHP官网&#xff1a;PHP: Hypertext Preprocessor apache官网&#xff1a;https://httpd.apache.org/ 一、搭建PHP环境 下载apache 进入官网点击download 选择下载windows版本文件 点击进入下载界面 点击下载64位版本文件 下载后解压文件 解压文件后进入 D:\httpd-2.4.59-24…...

HBase分布式数据库入门到精通

文章目录 HBase分布式数据库入门到精通 一、简单介绍 二、HBase数据模型 三、HBase的架构 四、HBase写操作流程 五、HBase读操作流程 六、HBase minor小合并和major大合并 七、HBase目标表meta表 八、HBase特点 九、HBase的使用场景 HBase分布式数据库入门到精通 一、…...

Java程序员必备技能之MySQL数据库 图解整理/快速入门

恭喜大家来到全新的篇章——MySQL数据库,这一篇我们将学会MySQL数据库的原理、使用sql对数据库的增删改查操作、以及对MySQL数据库的权限管理和用户管理等内容。请大家耐心看下去,相信大家在看完这篇文章后,一定可以学会MySQL数据库(不会Java也可以学会!)。 ps:想要补充…...

效果炸裂!使用 GPT-4o 快速实现LLM OS

使用 GPT-4o 快速实现LLM OS 什么是 LLM OS&#xff1f;LLM OS 主要有以下5个部分组成&#xff1a; LLM OS 开源实现运行 LLM OS 开源实现 什么是 LLM OS&#xff1f; 关于 LLM OS 的最初构想源自karpathy 在2023年11月11日发布的一条Twitter 动态&#xff0c;这是 LLM OS 概念…...

杀死那个进程

一、场景 eclipse在启动tomcat时&#xff0c;出现端口被占用的情况。我寻思着“任务管理器”没出现相应程序在跑啊。 1.1问题&#xff1a;端口和进程的关系 端口和进程之间存在着一种关系&#xff0c;端口是一个逻辑概念&#xff0c;它用于标识网络通信中的一个终点&#xff0…...

【vue与iframe通讯】

vue 与 iframe 通讯 发送数据vue 向 iframe 发送数据iframe 向 vue 发送数据接收信息( vue & iframe 通用) 实现相互通讯通讯流程图实现代码vue 页面iframe页面iframe 内部重定向访问地址,更新 vue 路由 访问跨域代码下载 前言&#xff1a;vue嵌套iframe实现步骤 发送数据…...

【Python-openslide】openslide.open_slide()

作用&#xff1a; 打开图片 wsi openslide.open_slide(path)注&#xff1a; path&#xff1a; 图片所在路径&#xff0c;需要具体到图片名称(包含扩展名) 我的实验中采用的是svs格式的图像...

推荐系统学习笔记(三)

swing召回通道 Q&#xff1a;假如重合的用户是一个小圈子&#xff1a;在一个群里&#xff0c;毫无关联的笔记也会被同时交互 solve&#xff1a;降低小圈子权重--------------swing的主要目的------------给用户加权 相似度&#xff1a; a是人工参数&#xff0c;overlap降低小…...

521源码-免费游戏源码下载-闯梦江湖Q萌复古全网通手游服务端H5全攻略

闯梦江湖H5&#xff1a;Q萌复古全网通手游服务端全攻略 一、概述 闯梦江湖H5 是一款结合Q萌画风与复古情怀的全网通H5手游。我们为您提供了最新打包的Windows服务端&#xff0c;并附带了通用视频架设教程和GM网页授权后台工具&#xff0c;让您轻松搭建并管理自己的游戏世界。 …...

【Zotero】【MacOS】Zotero6常用插件总结

因为目前MacOS只支持Zotero6&#xff0c;所以我将网上找到的教程以及自己找到适应Zotero6版本的插件做了个整合 教程地址&#xff1a;Zotero6安装/插件安装教程 插件地址&#xff1a;Zotero6_Plugs...

具有固定宽度的盒子:\makebox, \parbox

makebox \makebox 是 LaTeX 中的一个命令&#xff0c;用于创建一个具有固定宽度的盒子&#xff0c;并在该盒子内放置内容。这个命令可以用于控制文本或对象的位置和对齐。 语法如下&#xff1a; \makebox[<width>][<alignment>]{<content>}其中&#xff1…...

中央网信办等四部门发布《互联网政务应用安全管理规定》

互联网政务应用安全管理规定 &#xff08;2024年2月19日中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部制定 2024年5月15日发布&#xff09; 第一章 总则 第一条 为保障互联网政务应用安全&#xff0c;根据《中华人民共和国网络安全法…...

国产性能怪兽——香橙派AI Pro(8T)上手体验报告以及性能评测

目录 1、引言2、性能参数3、开箱体验4、实际使用5、性能比较总结参考文章 1、引言 第一次接触香橙派的开发板&#xff0c;之前使用过Arduino、树莓派3B、树莓派4B&#xff0c;STM32&#xff0c;51单片机&#xff0c;没有想到国产品牌性能一样强劲&#xff0c;使用起来也是很方便…...

适用于 Windows 7/8/10/11 的 6 款最佳免费分区软件

分区软件程序旨在帮助您创建、缩小、删除、扩展、合并或拆分硬盘和其他存储设备的分区。虽然可以在 Windows 中对硬盘进行分区而无需使用其他软件&#xff0c;但您可以执行的活动范围有限。例如&#xff0c;如果没有外部工具&#xff0c;您无法调整分区大小或合并分区。在这篇文…...

蓝桥杯备赛——DP续【python】

一、小明的背包2 试题链接&#xff1a;https://www.lanqiao.cn/problems/1175/learning/ 输入示例 5 20 1 6 2 5 3 8 5 15 3 3 输出示例 120 问题分析 这题是完全背包&#xff0c;每个物品有无数个&#xff0c;所以对于任意dp[i][j]&#xff08;其表示的意思为选到第i个…...

区块链系统开发测试----链码部署开发、系统开发验证

一.检查配置环境 检查虚拟机环境&#xff0c;确保有正在运行的Hyperledger Fabric区块链&#xff0c;并且其中chaincode_basic、credit_chaincode链码可以正常调用 查看chaincode_basic、credit_chaincode链码调用 二.开发征信链码代码 基于现有征信链码&#xff0c;开发征信…...

ResNet 学习

一. 残差块与残差层 简单来说&#xff0c;残差块是构成残差层的基本单元&#xff0c;而残差层则是由多个残差块组成的。在ResNet中&#xff0c;通常会堆叠多个残差层来构建深度模型。 (一).残差块&#xff08;Residual Block&#xff09; 这是ResNet的基本构建单元。一个残差块…...

前端React老项目打包caniuse-lite报错解决思路

1、下载项目&#xff0c;先更新.npmrc文件&#xff1a; registryhttp://registry.npmmirror.com 2、安装依赖&#xff0c;本地启动&#xff0c;运行正常&#xff0c;但直接提交代码线上打包时会报错&#xff1a; “ 未找到相关的合并请求。” 打开日志页面&#xff0c;报错信息…...

【全开源】优校管理系统支持微信小程序+微信公众号+H5

概述 优校管理系统(简称优校管)是基于FastAdmin和ThinkPHP进行开发的中小学信息化管理系统&#xff0c;拥有PC版、UniAPP版(高级授权)。支持微信小程序、H5等多平台&#xff0c;主要用于信息管理、教学管理、素养评价&#xff0c;支持多个学校(标准授权限5个&#xff0c;高级授…...

Python条件分支与循环

大家好&#xff0c;当涉及到编写高效和灵活的程序时&#xff0c;条件分支和循环是 Python 中至关重要的概念。它们允许我们根据不同的条件执行不同的代码块&#xff0c;或者重复执行一组语句。条件分支和循环是测试开发工程师在日常工作中经常使用的工具&#xff0c;无论是编写…...

AI手语研究数据集;视频转视频翻译和风格化功能如黏土动画;AI检测猫咪行为;开放源码的AI驱动搜索引擎Perplexica

✨ 1: Prompt2Sign 多语言手语数据集&#xff0c;便捷高效用于手语研究。 Prompt2Sign 是一个全面的多语言手语数据集&#xff0c;旨在通过工具自动获取和处理网络上的手语视频。该数据集具有高效、轻量的特点&#xff0c;旨在减少先前手语数据集的不足之处。该数据集目前包含…...

四川景源畅信:新人做抖店的成本很高吗?

随着社交媒体的兴起&#xff0c;抖音成为了一个新兴的电商平台——抖店。不少创业者和商家看中了其庞大的用户基础&#xff0c;想要通过开设抖店来拓展销路。然而&#xff0c;对于刚入行的新手来说&#xff0c;成本问题总是让人犹豫不决。究竟新人做抖店的成本高不高?本文将围…...