当前位置: 首页 > 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.jsqmd.com/news/102893/

相关文章:

  • 4.1.17.7.SQL优化
  • 全国头部ai公司,是上海光景泽研科技有限公司
  • AI语音进化论:EmotiVoice如何实现情感编码与还原
  • Agent原型虽好,却迟迟难落地?AgentCore来破局!
  • EmotiVoice情感语音一致性验证:长文本表现如何?
  • 美业小程序系统哪个好?怎么选?全面解析助你省钱避坑!
  • 全国城市建筑垃圾违法倾倒点卫星排查工作汇报暨省市县乡排查报告获取方式(仅供机关内部交流使用)
  • 【武汉大学-AAAI26】S5: 遥感中的可扩展半监督语义分割
  • Typora代码块痛点破解万字详解
  • 创意AI应用开发大赛:基于Google AI Studio构建创新性人工智能解决方案万字详解
  • 用代码生成电影预告片:Python实现智能剪辑创意
  • EmotiVoice在元宇宙场景中的语音赋能路径
  • 2、Linux基础命令:ls命令全解析
  • 3、Linux 文件管理与操作全攻略
  • 4、Linux 文件操作命令全解析
  • 老旧电脑硬件升级万字指南:焕发新生,性能飞跃
  • EmotiVoice语音合成模型的推理能耗与绿色计算考量
  • 菜鸟小师妹对着无刷电机一脸迷茫,老王神秘兮兮的递过来一颗芯片......
  • EmotiVoice语音合成在语音日记类APP中的情感共鸣设计
  • 如何训练自定义情感模型接入EmotiVoice框架?
  • 使用Docker快速启动EmotiVoice语音合成服务
  • EmotiVoice语音合成中的多轮对话情感连贯性维护
  • 【第12天】12c#今日小结
  • 使用EmotiVoice打造专属声音IP:适用于短视频与播客
  • EmotiVoice能否支持多人协作编辑语音项目?
  • set和get属性、修饰符范围
  • 析构函数、构造函数
  • 属性的set和get访问器,构造函数和析构函数
  • 41、脚本开发与调试技巧全解析
  • 42、调试器使用指南:深入探索与实践