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

MySQL中的行级锁

MySQL中锁有很多种,其中从锁的粒度来区分的话可以分为表级锁,行级锁,页级锁

本文主要介绍下

行级锁

MySQL中的行级锁是MySQL中InnoDB存储引擎提供的一种细粒度的锁,基于索引实现的,锁是加在索引上的,而不是数据行本身。

同样是行级锁,InnoDB存储引擎对于其实现还可以细分为记录锁(Record Lock),间隙锁(Gap Lock),临键锁(Next-Key Lock)和插入意向锁(Insert Intention Lock)

记录锁(Record Lock)

记录锁也就是常说的行锁,顾名思义其锁定的是某一行数据。

-- id = 1 的行会被加记录排他锁
update product_sale_record set sold_num = sold_num + 1 where id = 1;

-- id = 1 的行会被加共享锁
select * from product_sale_record  where id = 1; LOCK IN SHARE MODE;
场景举例

假设两个事务A,B并发执行下面的SQL:

start transaction;

update t_shop_product_sale_record set sold_num = sold_num +1 where id = 1;

commit;

当事务A执行 update 时会对 id = 1 这行数据的排它锁。

在事务A未提交的情况下,如果开启事务B执行 update ,会出现锁等待然后超时:Lock wait timeout exceeded; try restarting transaction

间隙锁(Gap Lock)

锁定索引记录之间的间隙,防止其他事务在范围内插入新数据。

-- id 在 1 和 10 之间的间隙会被加排他锁。
update product_sale_record WHERE id > 1 AND id < 10;

-- id 在 1 和 10 之间的间隙会被加共享锁。
select * from product_sale_record  WHERE id > 1 AND id < 10 LOCK IN SHARE MODE;

临键锁(Next-Key Lock)

临键锁可以理解为是记录锁和间隙锁的组合,锁定索引记录及其前面的间隙。

-- id > 1 的记录及其前面的间隙会被加排他锁
update product_sale_record WHERE id > 1;

-- id > 1 的记录及其前面的间隙会被加共享锁
select * from product_sale_record where id > 1 LOCK IN SHARE MODE;

http://www.kler.cn/a/569691.html

相关文章:

  • Linux内核配置与构建原理
  • P8654 [蓝桥杯 2017 国 C] 合根植物---并查集!!!
  • 力扣1462. 课程表 IV
  • SpringSecurity的配置
  • AIGC(生成式AI)试用 26 -- 跟着清华教程学习 - DeepSeek与AI幻觉
  • 数字人技术再超越,TANGO 可生成与音频匹配的全身手势视频
  • Ubuntu20.04下各类常用软件及库安装汇总(联想Y9000P24款)
  • AI产品经理W1D4埋点设计数据采集
  • java关键字-instanceof
  • 具身智能(Embodied AI)的物理交互基准测试:构建真实世界的智能体评估体系
  • 奇妙跨界:将前端概念融入整数操作
  • Python 爬虫 – BeautifulSoup
  • Linux常见基本指令(二)
  • 批量提取 Word 文档中的页面
  • php序列化与反序列化
  • 迷你世界脚本世界接口:World
  • 矩阵 trick 系列 题解
  • 算法日常刷题笔记(3)
  • 【R语言】PCA主成分分析
  • 计算机毕业设计SpringBoot+Vue.js常规应急物资管理系统(源码+文档+PPT+讲解)