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;
到此这篇关于MySQL中的行级锁的文章就介绍到这了,更多相关mysql行级锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
CenOS6.7下mysql 8.0.22 安装配置方法图文教程
这篇文章主要为大家详细介绍了CenOS6.7下mysql 8.0.22 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2020-11-11
MySQL中TINYINT、INT 和 BIGINT的具体使用
MySQL提供了多种整数类型来满足不同的数据存储需求,本文主要介绍了MySQL中TINYINT、INT 和 BIGINT的具体使用,具有一定的参考价值,感兴趣的可以了解一下2024-07-07


最新评论