news 2026/7/12 16:55:06

4.1.17.6.锁

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4.1.17.6.锁

1.锁的分类

1.1.按锁粒度划分

表锁:开销小,加锁快;锁定力度大,发生锁冲突概率高,并发度最低;不会出现死锁。

行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般

1.2.按兼容性划分

共享锁(S Lock),也叫读锁(read lock),相互不阻塞。

排他锁(X Lock),也叫写锁(write lock),排它锁是阻塞的,在一定时间内,只有一个请求能执行写入,并阻止其它锁读取正在写入的数据。

1.3.按加锁机制划分

①乐观锁

乐观锁基于这样的假设:冲突在系统中出现的频率较低,因此在数据库事务执行过程中,不会频繁地去锁定资源。相反,它在提交更新的时候才检查是否有其他事务已经修改了数据。

可以通过在数据表中使用版本号(Version)或时间戳(Timestamp)来实现,每次读取记录时,同时获取版本号或时间戳,更新时检查版本号或时间戳是否发生变化。

如果没有变化,则执行更新并增加版本号或更新时间戳;如果检测到冲突(即版本号或时间戳与之前读取的不同),则拒绝更新。

②悲观锁

悲观锁假设冲突是常见的,因此在数据处理过程中,它会主动锁定数据,防止其他事务进行修改。

可以直接使用数据库的锁机制,如行锁或表锁,来锁定被访问的数据。常见的实现是 SELECT FOR UPDATE 语句,它在读取数据时就加上了锁,直到当前事务提交或回滚后才释放。

2.InnoDB行锁的实现(?)

2.1.记录锁

Record Lock 记录锁

记录锁就是直接锁定某行记录。当我们使用唯一性的索引(包括唯一索引和聚簇索引)进行等值查询且精准匹配到一条记录时,此时就会直接将这条记录锁定。

2.2.间隙锁

间隙锁(Gap Locks) 的间隙指的是两个记录之间逻辑上尚未填入数据的部分,是一个左开右开空间。间隙锁就是锁定某些间隙区间的。当我们使用用等值查询或者范围查询,并且没有命中任何一个record,此时就会将对应的间隙区间锁定。

2.3.临键锁

临键指的是间隙加上它右边的记录组成的左开右闭区间。临键锁就是记录锁(Record Locks)和间隙锁(Gap Locks)的结合,即除了锁住记录本身,还要再锁住索引之间的间隙。当我们使用范围查询,并且命中了部分record记录,此时锁住的就是临键区间。

临键锁锁住的区间会包含最后一个 record 的右边的临键区间。

当使用唯一性索引,等值查询匹配到一条记录的时候,临键锁(Next-Key Locks)会退化成记录锁;没有匹配到任何记录的时候,退化成间隙锁。

3.意向锁

意向锁是一个表级锁,不要和插入意向锁搞混。

意向锁的出现是为了支持 InnoDB 的多粒度锁,它解决的是表锁和行锁共存的问题。

当我们需要给一个表加表锁的时候,我们需要根据去判断表中有没有数据行被锁定,以确定是否能加成功。

假如没有意向锁,那么我们就得遍历表中所有数据行来判断有没有行锁;

有了意向锁这个表级锁之后,则我们直接判断一次就知道表中是否有数据行被锁定了。

有了意向锁之后,要执行的事务 A 在申请行锁(写锁)之前,数据库会自动先给事务 A 申请表的意向排他锁。当事务 B 去申请表的互斥锁时就会失败,因为表上有意向排他锁之后事务 B 申请表的互斥锁时会被阻塞。

4.排查死锁

排查死锁的一般步骤是这样的:

1)查看死锁日志 show engine innodb status;

------------------------

LATEST DETECTED DEADLOCK

------------------------

2019-07-21 12:34:56 0x7f89c000a700

*** (1) TRANSACTION:

TRANSACTION 123456, ACTIVE 10 sec inserting

mysql tables in use 1, locked 1

LOCK WAIT 7 lock struct(s), heap size 1248, 0 row lock(s), undo log entries 6

MySQL thread id 12345, OS thread handle 140347674319872, query id 9876547 localhost root update

UPDATE my_table SET col1 = 100 WHERE col2 = 'value';

*** (2) TRANSACTION:

TRANSACTION 123457, ACTIVE 9 sec fetching rows

mysql tables in use 1, locked 1

7 lock struct(s), heap size 1248, 0 row lock(s), undo log entries 6

MySQL thread id 12346, OS thread handle 140347674319873, query id 9876548 localhost root update

UPDATE my_table SET col1 = 200 WHERE col2 = 'value';

2)找出死锁 sql

3)分析 sql 加锁情况

4)模拟死锁案发

5)分析死锁日志

6)分析死锁结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/11 18:09:22

Agent原型虽好,却迟迟难落地?AgentCore来破局!

当前,关于企业级AI应用的讨论,核心焦点已然发生了根本性转变,人们不再局限于探讨“AI能否理解语言”,而是更关注“AI能否自主执行复杂的业务流程,从而创造业务价值”。麦肯锡相关研究显示,到2030年&#xf…

作者头像 李华
网站建设 2026/7/12 2:10:48

代码重构艺术:烂代码改造与设计模式实战

引言:何为好代码?在软件工程领域,重构被比作"整理代码的房间"。好的代码不仅要能工作,还应具备可读性、可维护性和可扩展性。让我们从一个真实案例开始,探索重构的艺术。第一部分:重构前的"…

作者头像 李华
网站建设 2026/7/11 18:09:19

EmotiVoice语音合成中的多轮对话情感连贯性维护

EmotiVoice语音合成中的多轮对话情感连贯性维护 在虚拟助手越来越频繁地走进我们生活的今天,一个关键问题逐渐浮现:为什么大多数AI说话依然“冷冰冰”?即便它们能准确回答问题,却很难让人产生共鸣。用户不再满足于“听得清”&…

作者头像 李华
网站建设 2026/7/11 18:09:18

44、MS-DOS INT 21h 功能调用详解

MS-DOS INT 21h 功能调用详解 1. 引言 在早期的计算机编程中,MS - DOS 提供了一系列方便的功能调用接口,通过 INT 21h 中断来实现。这些功能涵盖了输入输出、日期时间获取与设置等多个方面,极大地简化了程序员的开发工作。下面我们来详细了解这些功能。 2. INT 21h 基础 …

作者头像 李华
网站建设 2026/7/12 4:34:42

61、MASM 参考指南

MASM 参考指南 1. 引言 Microsoft MASM 6.11 手册最后一次印刷是在 1992 年,它包含三卷: - 程序员指南 - 参考手册 - 环境与工具 可惜的是,印刷版手册多年来已不再发售,但 Microsoft 在其平台 SDK 包中提供了手册的电子副本(MS - Word 文件),印刷版手册无疑成了收…

作者头像 李华
网站建设 2026/7/12 14:24:18

如何调优EmotiVoice的情感强度参数以获得最佳听感?

如何调优EmotiVoice的情感强度参数以获得最佳听感? 在虚拟角色对话中,一句“你真让我失望”如果用平铺直叙的语气说出,可能毫无波澜;但若语调下沉、节奏迟缓、略带颤抖,瞬间就能传递出深深的伤感。这种情绪张力&#x…

作者头像 李华