MySQL-InnoDB行锁算法-三种详解

本文详细介绍了MySQL InnoDB存储引擎的行锁机制,包括行锁的定义、如何通过索引实现行锁,并重点阐述了三种行锁类型:记录锁、间隙锁和临键锁的工作原理及其应用场景。强调行锁必须基于索引,否则可能导致全表锁。

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

1、行锁是什么?

字面意思,给一行数据加锁。
InnoDB 行锁是通过给索引上的索引项加锁来实现的,如果没有索引,InnoDB 将通过隐藏的聚簇索引来对记录加锁。
注意:行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。 两个事务不能锁同一个索引。

2、三种算法

(1)Record lock:记录锁,单个行记录上的锁
锁住具体的索引项,当SQL执行按照唯一性索引进行数据的检索时,查询条件等值匹配且查询的数据是存在,这时SQL语句加上的锁即为记录锁Record locks,锁住具体的索引项

BEGIN;-- 开始事务
SELECT * FROM my_table WHERE id = 2021 FOR UPDATE; -- 排它锁的记录锁算法
ROLLBACk;-- 回滚事务
# 普通事务执行
SELECT * FROM my_table  WHERE id = 2021 FOR UPDATE;
SELECT * FROM my_table  WHERE id = 2020 FOR UPDATE;

(2)Gap lock:间隙锁,锁定一个范围,但不包含记录本身

  • 当sql执行按照索引进行数据的检索时,查询条件的数据不存在,这时SQL语句加上的锁即为 Gap locks,锁住索引不存在的区间(左开右开的区间)
  • Gap只在RR事务隔离级别/repeatable read存在
BEGINSELECT * FROM my_table WHERE id > 2001 AND id < 2021 FOR UPDATE; --排它锁的间隙锁算法
SELECT * FROM my_table WHERE id = 2021 FOR UPDATE; -- 另一种方式
ROLLBACK;

(3)Next-key lock:record+gap,临建锁,锁定一个范围,且包含记录本身

  • 锁住记录+区间(左开右闭的区间)
  • 当sql执行按照索引进行数据的检索时,查询条件为范围查找(between and、<、>等)并有数据命中则此时SQL语句加上的锁为Next-key locks,锁住索引的记录+区间(左开右闭的区间)
  • 在这里插入图片描述
BEGINSELECT * FROM my_table WHERE id > 2001 AND id < 2021 FOR UPDATE; --临建锁的间隙锁算法
-- 其他事务执行
set session autocommit=off;
select * from t2 where id=4 for update;  --没锁住
select * from t2 where id=7 for update;  --锁住
select * from t2 where id=10 for update; --锁住
INSERT INTO `t2` (`id`, `name`) VALUES (9, '9');
ROLLBACK;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值