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

news2024/9/24 15:26:07

技多不压身!

大家好,我是 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会根据需要自动在页级别上应用锁。

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

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

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

相关文章

YYDS!哈工大博士PyTorch笔记火了!!

Pytorch是目前常用的深度学习框架之一&#xff0c;它凭借着对初学者的友好性、灵活性&#xff0c;发展迅猛&#xff0c;它深受学生党的喜爱&#xff0c;我本人也是使用的Pytorch框架。 比起 TF 的框架环境配置不兼容&#xff0c;和 Keras 由于高度封装造成的不灵活&#xff0c…

三、Ollama导入大模型(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

Ollama导入大模型 一、导入Ollama大模型1、使用run命令2、使用Modelfile方式 二、导入自定义大模型&#xff08;Ollama官网以外的大模型&#xff09;三、使用OpenWebUI导入大模型 Ollama可以导入官方提供的大模型&#xff0c;也可以导入huggingface上的自定义大模型&#xff08…

以太坊现货ETF获批:引发ETH价格暴涨,市场热议达到高潮

2024年5月24日&#xff0c;北京时间&#xff0c;以太坊现货ETF正式获得美国证券交易委员会&#xff08;SEC&#xff09;的批准&#xff0c;成为继比特币之后&#xff0c;美国主权政府承认的又一加密货币基金产品。这一意外的利好消息引发了加密货币市场的狂欢&#xff0c;以太坊…

东软的第三个研发基地,为什么选择了武汉?

继沈阳、大连之后&#xff0c;东软集团在国内打造的第三个研发基地——武汉东软软件园&#xff0c;于2024年5月25日正式开园。 “占地面积158亩、建筑面积14万余平方米的武汉东软软件园&#xff0c;从开工到竣工仅仅用了18个月的时间。这样的建设速度&#xff0c;充分体现了武汉…

香橙派Kunpeng Pro性能测评:高效能小型服务器开发板的全面体验

香橙派 Kunpeng Pro 是一款面向开发者和教育市场的高性能单板计算机&#xff0c;其搭载了鲲鹏处理器&#xff0c;可提供 8TOPS INT8 计算能力&#xff0c;提供了 8GB 和 16GB 两种内存版本&#xff0c;开发板结合了鲲鹏全栈根技术&#xff0c;全面使能高校计算机系统教学和原生…

3D Web轻量化平台HOOPS Web Platform在数字工厂中的应用实例

今天我们来聊聊HOOPS工具对大型数据的处理和可视化管理。这里是一个数字工厂的仪表盘展示&#xff0c;您可以在仪表盘上看到包括工厂的能源消耗、计划产量等数据信息&#xff0c;以及各种制造机器的生产量。 HOOPS中文网http://techsoft3d.evget.com/ 我们的HOOPS工具&#xf…

window.location.search取不到值

window.location.search window.location.search没有值的原因&#xff1a; URL中使用了 hash &#xff08;指URL中带有#符号&#xff09;,导致URL后面携带的参数被location.hash截取走了&#xff0c;你再使用window.location.search得到的就是空值 打印 window.location 其实…

网络侦察技术

网络侦察技术 收集的信息网络侦察步骤搜索引擎检索命令bing搜索引擎Baidu搜索引擎Shodan钟馗之眼(zoomeye) whois数据库&#xff1a;信息宝库查询注册资料 域名系统网络拓扑社交网络跨域拓展攻击 其它侦察手段社会工程学社会工程学常见形式Web网站查询 其它非技术侦察手段总结网…

通过代码重用攻击绕过现代XSS防御

XSS已有近二十年的历史了&#xff0c;但它仍然是Web上最常见的漏洞之一。因此&#xff0c;已经发展了许多机制来减轻漏洞的影响。我经常会误以为这些机制可以作为针对XSS的保护。今天&#xff0c;我们将了解为什么情况并非如此。我们将在代码重用攻击领域探索一种相对较新的技术…

5.基于python的scRNA-seq细胞状态分析-细胞扰动

参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 目录 背景识别受扰动影响最大的细胞类型预测细胞的扰动响应构建模拟数据集构建scGEN 背景 前面学习了不同处理条件下的基因差异表…

QGis3.34.5工具软件保存样式,软件无反应问题

在使用QGis软件保存SLD样式的时候&#xff0c;每次保存样式&#xff0c;软件都进入无反应状态&#xff0c;导致无法生成样式文件 百度中多次查询问题点&#xff0c;终未能在在3.34.5这个版本上解决问题。 考虑到可能是软件本身问题&#xff0c;于是删除了3.34.5这个版本&#x…

报修新选择:一款软件搞定所有维修问题

数字化、智能化时代发展迅速&#xff0c;各类便捷、智能化软件应用已经深入到我们生活和工作的方方面面。尤其是在企业或学校的设备管理中&#xff0c;报修维修工作一直是一个重要环节。传统的报修方式&#xff0c;如电话报修、填写纸质报修单等&#xff0c;已经无法满足现代高…

Pytorch索引、切片、连接

文章目录 1.torch.cat()2.torch.column_stack()3.torch.gather()4.torch.hstack()5.torch.vstack()6.torch.index_select()7.torch.masked_select()8.torch.reshape9.torch.stack()10.torch.where()11.torch.tile()12.torch.take() 1.torch.cat() torch.cat() 是 PyTorch 库中的…

联想凌拓 NetApp AFF C250 全闪存存储助力丰田合成打造数据新“引擎”

联想凌拓 NetApp AFF C250全闪存存储助力丰田合成打造数据新“引擎” 丰田合成&#xff08;张家港&#xff09;科技有限公司&#xff08;以下简称“丰田合成”&#xff09;于2003年12月成立&#xff0c;坐落在中国江苏省张家港市保税区中华路113号&#xff0c;是日本丰田合成株…

亚马逊自养号与机刷有何区别?

在亚马逊这一全球电商巨头中&#xff0c;买家评价的重要性如同指南针般引领着消费者的购买决策。在购买前&#xff0c;消费者们往往会驻足查看产品的评论&#xff0c;仔细比较不同产品的买家口碑&#xff0c;以确保自己的选择既明智又满意。因此&#xff0c;测评成为了各大电商…

空间转录组数据的意义

10X空间转录组Visium学习笔记&#xff08;三&#xff09;跑通Visium全流程记录 | 码农家园 (codenong.com) 这两个的区别是&#xff1a;一个是像素的位置信息&#xff0c;一个是阵列的位置信息

百度百科个人词条怎么这么难通过?

百度百科作为国内最具影响力的知识平台&#xff0c;个人词条的通过率却让很多人感到困惑。为什么我的个人词条总是难以通过&#xff1f;伯乐网络传媒给大家揭秘百度百科个人词条审核的难点&#xff0c;并提供相应的对策。 一、百度百科词条难以通过的原因分析 1. 内容不符合审…

小动物单通道麻醉机、多通道麻醉机

ZL-04A-5多通道小动物麻醉机采用英国进口的挥发罐体&#xff0c;国内组装而成&#xff0c;产品输出气体稳定。多通道小动物麻醉机无需氧气瓶&#xff0c;自带空气输出机&#xff0c;小动物麻醉机对氧气浓度有要求可以选配氧气输出机。 详情介绍&#xff1a; 产品特点&#xf…

巅峰对决:OpenAI与Google如何用大模型开创未来

2024年&#xff0c;人工智能领域正引领着一场波澜壮阔的全球技术革命。 5月14日&#xff0c;OpenAI揭开了其新一代多模态人工智能大模型GPT4系列的神秘面纱&#xff0c;其中GPT-4o不仅拥有流畅迷人的嗓音&#xff0c;还展现出幽默、机智和深刻的洞察力……紧接着&#xff0c;在…

【MySQL数据库】存储过程实战——图书借阅系统

图书借阅归还 借阅不用count判断&#xff0c;归还不用具体字段值判断 每次借阅或者归还只能操作1本 数据准备 -- 创建数据库 create database db_test3 CHARACTER SET utf8 COLLATE utf8_general_ci; -- 使用数据库 use db_test3; -- 创建图书信息表&#xff1a; create tabl…