news 2026/5/8 22:00: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/5/7 5:01:43

美业小程序系统哪个好?怎么选?全面解析助你省钱避坑!

随着数字化转型的深入,美业商家纷纷借助小程序提升服务效率、拓展客源。然而面对市场上琳琅满目的小程序系统,许多商家陷入“选择困难”。本文将从核心功能、常见类型及选择建议三方面全面解析,助你找到最适合自己的美业小程序解决方案。一、…

作者头像 李华
网站建设 2026/5/3 7:06:36

用代码生成电影预告片:Python实现智能剪辑创意

创建一个完整的Python电影预告片生成系统,该系统可以分析电影内容、提取关键场景,并自动生成吸引人的预告片。python""" 电影预告片智能生成系统 功能:自动分析电影内容,提取关键场景,生成预告片 "…

作者头像 李华
网站建设 2026/4/18 7:04:44

【第12天】12c#今日小结

1.set和get访问器 set和get访问器 其实就是方法 set访问器:给字段设置值的方法,带一个参数,一般起成value, 把value赋值给字段、 get访问器:获取字段值的 带返回值的 return 字段; 如果对类里面的字段进行限制、或者拦截处理…

作者头像 李华
网站建设 2026/5/4 23:56:51

35、深入探索 `interact` 命令的强大功能

深入探索 interact 命令的强大功能 1. interact 与 expect 命令的区别 interact 和 expect 命令用于不同类型的交互,它们的算法都非常适合各自的用途。 expect 命令主要用于查找响应或提示,在这个过程中,不被中间可能类似模式的内容干扰是很重要的。而 intera…

作者头像 李华
网站建设 2026/5/2 14:40:14

37、深入探索 Expect 交互与进程控制

深入探索 Expect 交互与进程控制 1. 基本输入输出交互 最初的输入是隐式的,即 user_spawn_id 。用户的按键操作会发送到 out ,而从 in 接收到的输入会被发送回 user_spawn_id ,这样用户就能读取到这些输入。外部进程可以是 C 程序,也可以是另一个带有自身 inter…

作者头像 李华
网站建设 2026/5/8 0:20:30

45、Expect脚本的终端模拟与应用实践

Expect脚本的终端模拟与应用实践 1. 终端模拟绑定与功能实现 在终端模拟中,有一系列的绑定与功能实现。例如,对于特定的转义序列有相应的处理: term_update_cursor } "^\x1b\\\[H\x1b\\\[J" {# (clear,cl) Clear screenterm_clearterm_update_cursor } "…

作者头像 李华