10人参与 • 2025-03-03 • Mysql
mysql中锁有很多种,其中从锁的粒度来区分的话可以分为表级锁,行级锁,页级锁。
本文主要介绍下
mysql中的行级锁是mysql中innodb存储引擎提供的一种细粒度的锁,基于索引实现的,锁是加在索引上的,而不是数据行本身。
同样是行级锁,innodb存储引擎对于其实现还可以细分为记录锁(record lock),间隙锁(gap lock),临键锁(next-key lock)和插入意向锁(insert intention 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
锁定索引记录之间的间隙,防止其他事务在范围内插入新数据。
-- 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;
临键锁可以理解为是记录锁和间隙锁的组合,锁定索引记录及其前面的间隙。
-- 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行级锁内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论