mysql锁的实际场景分析

本文通过实例分析MySQL在RR隔离级别下,不同操作(如update、insert、delete、select...from update)如何产生行锁、间隙锁。重点讨论了间隙锁的作用——防止幻读,并举例说明在不同场景下,何时会触发间隙锁以及其对并发操作的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇博文主要记录mysql实际场景下遇到的问题,并不是为了八股文,不怎么场景的也不会去分析,主打一个实战,所以mysql的锁场景,此处默认都是RR隔离级别并且存储引擎是InnoDB
锁问题:

  • 间隙锁在哪些场景下需要用到,作用是什么?
  • update、insert、delete、select* from update 这些操作时是产生行锁还是表锁或者是间隙锁,分别产生的场景又是什么呢?

接下里就围绕这些问题来分析,首先什么是行锁,就不多说了肯定是已存在的唯一定位的数据采会产生行锁,表锁顾名思义就是给这张表每行数据都加上行锁及数据之间的添加间隙锁,效果就相当于表锁

深入探究mysql间隙锁的原理

由于本次博客不是为了八股文 ,但是肯定需要一些基础理论,我直接引用下别的博主的文章
深入探究mysql间隙锁的原理
看完之后至少大家知道两点

  1. 间隙锁产生的原因之一就是SELECT * FROM student FOR UPDATE
  2. 作用是为了解决幻读,并且是当前读(在RR级别下,MVCC主要解决大部分的幻读,但是只是解决了快照度,针对一些当前读没办法,只能使用间隙锁)

间隙锁除了上面的语句导致的 还有其他的吗?肯定不止的,接下去我会继续分析

在这里插入图片描述
假设我有这张表,接下来我会直接说出结果,因为我已经尝试过了,大家可以线下去论证我的结果是否正确

现象一

test表

id name
1 张三
1 李四
5 王五

SET autocommit = 0;
BEGIN;
UPDATE test SET name = ‘张三2’, mark = ‘汉’ WHERE id = 3;
COMMIT;
如果更新的时候这个事务还没有提交,那么会产生间隙锁,因为这条记录不存在,就会将左边满足条件的区间给锁住,比如1~5之间的区间给锁住,那么此时别的事务更新、插入都将会阻塞

现象二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值