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

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)分析死锁结果

http://www.zskr.cn/news/113693.html

相关文章:

  • 全国头部ai公司,是上海光景泽研科技有限公司
  • AI语音进化论:EmotiVoice如何实现情感编码与还原
  • 2、Linux基础命令:ls命令全解析
  • 菜鸟小师妹对着无刷电机一脸迷茫,老王神秘兮兮的递过来一颗芯片......
  • 如何训练自定义情感模型接入EmotiVoice框架?
  • 【第12天】12c#今日小结
  • 使用EmotiVoice打造专属声音IP:适用于短视频与播客
  • 31、《Expect 中 spawn 命令的使用与相关问题处理》
  • 33、Expect 脚本中的信号处理与交互命令详解
  • EmotiVoice支持中英文混合语音合成吗?实测结果揭晓
  • JStillery:高级JavaScript去混淆工具深度解析
  • 实验拓扑分享:链路聚合(Eth-Trunk)的极简实现
  • 从文本到情感语音:EmotiVoice让AI发声更自然
  • EmotiVoice语音合成在儿童早教机中的实际应用案例
  • EmotiVoice与VITS、XTTS等模型的横向对比分析
  • EmotiVoice在直播场景中的潜在应用探索
  • 46、16位MS-DOS编程与磁盘基础全解析
  • EmotiVoice能否用于电话客服系统?可行性分析
  • Flutter 性能调优终极手册(2025 版):从冷启动 3s 到帧率稳定 60fps 的实战指南
  • 57、MS-DOS编程、汇编器使用与英特尔指令集详解
  • 53、鼠标编程与BIOS级编程全解析
  • 48、磁盘操作与文件管理基础
  • 51、INT 10h 视频编程与图形绘制全解析
  • 讲真,没见过这么心狠手辣的空降领导!
  • VNote极速上手:打造你的专属Markdown笔记空间
  • Git 回退神技:用ID一键“穿越”到旧版本
  • 实体零售推荐哪些AI搜索排名(GEO优化)做的好的企业?
  • 【Leetcode】3008. Find Beautiful Indices in the Given Array II
  • 从告警风暴到智能运维:keep+Prometheus构建企业监控新范式
  • 一个让你像聊天一样做PPT的AI工具