Mysql的间隙锁,记录锁,临键锁

本文深入探讨了MySQL中InnoDB引擎的行锁,包括共享锁(S锁)、排它锁(X锁)、记录锁、间隙锁和临键锁。在不同的事务隔离级别下,锁的使用和影响各有不同。通过实验展示了在可重复读(REPEATABLE-READ)和读已提交(READ-COMMITTED)级别下,如何使用for update和update语句进行加锁,并分析了锁的行为和范围。文章最后讨论了更新操作在不同场景下的锁机制,并提出了实验中观察到的一些现象和疑问。

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

聊到mysql的锁,好像就有了一个聊不完的话题。网上一搜感觉各种答案都有,各种方式的描述也有,种类繁多,描述繁琐,反正看来看去,基本最后看多少忘记多少。

mysql 分储存引擎来聊锁。myisam 表锁,innodb行锁、表锁。

行锁:

共享锁(S锁:share):当读取一行记录的时候,为了防止其他人修改,则需要加S锁。
排它锁(X锁:exclusive):当修改一行的记录的时候,为了防止其他人同时修改,则需要添加X锁。

X S
X 不兼容 不兼容
S 不兼容 兼容

记录锁:添加在行索引上的锁

​间隙锁:锁定范围是索引记录之间的间隙,针对可重复读以上隔离级别

​临键锁:记录锁+间隙锁

表锁:

​ 意向锁:在获取某行的锁之前,必须要获取表的锁,分为意向共享锁,意向排它锁

​ 自增锁:对自增字段所采用的特殊表级锁

锁模式的含义:

​ IX:意向排它锁,表示是将要在表上加排他锁。

​ X:锁定记录本身和记录之前的间隙

​ S:锁定记录本身和记录之前的间隙

​ X,REC_NOT_GAP:只锁定记录本身

​ S,REC_NOT_GAP:只锁定记录本身

​ X,GAP:间隙锁,不锁定记录本身

​ S,GAP:间隙锁,不锁定记录本身

​ X,GAP,INSERT_INTENTION:插入意向锁

锁一般在什么情况下会出现?
不同的引擎出现不同的锁,MyIasm 只有表锁,Innodb 就表锁 行锁都会有。一般锁的出现会在使用事务的时候为了保证当前事务的一致性,用到了 for update语句,或者update xxx where xxx 、等语句的时候出现。

我们如何查看到这些锁?
首先设置开启锁信息输出:
在这里插入图片描述
然后:

begin; 
select * from t for update; 
show engine innodb status\G;

执行结果如下:

Query OK, 0 rows affected (0.00 sec)

+------+------+
| id   | name |
+------+------+
|   10 | 10   |
|   20 | 20   |
|   30 | 30   |
+------+------+
3 rows in set (0.00 sec)

*************************** 1. row ***************************
  Type: InnoDB
  Name: 
Status: 
=====================================
2021-05-08 09:58:23 0x7fde205d2700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 13 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 5 srv_active, 0 srv_shutdown, 2447 srv_idle
srv_master_thread log flush and writes: 0
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 6
OS WAIT ARRAY INFO: signal count 5
RW-
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ocean曈

您的支持,是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值