MySQL进阶45讲【7】行锁 左手的ㄟ右手 2024-05-07 22:30 86阅读 0赞 ## 1 前言 ## 在上一篇文章中,介绍了MySQL的全局锁和表级锁,今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB是支持行锁的,这也是MyISAM被InnoDB替代的重要原因之一。 我们今天就主要来聊聊InnoDB的行锁,以及如何通过减少锁冲突来提升业务并发度。 顾名思义,行锁就是针对数据表中行记录的锁。这很好理解,比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能进行更新。 当然,数据库中还有一些没那么一目了然的概念和设计,这些概念如果理解和使用不当,容易导致程序出现非预期行为,比如两阶段锁。 ## 2 从两阶段锁说起 ## 先给大家举个例子。在下面的操作序列中,事务B的update语句执行时会是什么现象呢?假设字段id是表t的主键。 ![在这里插入图片描述][4dea400dd267453089c96c9eacd1a2f8.png] 这个问题的结论取决于事务A在执行完两条update语句后,持有哪些锁,以及在什么时候释放。 可以验证一下:实际上事务B的update语句会被阻塞,直到事务A执行commit之后,事务B才能继续执行。 知道了这个答案,就一定知道了事务A持有的两个记录的行锁,都是在commit的时候才释放的。 [4dea400dd267453089c96c9eacd1a2f8.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/05/07/bbe6dd3bcfad4afc8f029dbad385741f.png
相关 MySQL进阶45讲【14】count(*)这么慢,该怎么办? MySQL进阶45讲【14】count(*)这么慢,该怎么办? 骑猪看日落/ 2024年05月07日 22:32/ 0 赞/ 88 阅读
相关 MySQL进阶45讲【38】insert语句的锁为什么这么多? MySQL进阶45讲【38】insert语句的锁为什么这么多? 爱被打了一巴掌/ 2024年05月07日 22:28/ 0 赞/ 87 阅读
相关 MySQL进阶45讲【20】为什么只改一行的语句,锁这么多? MySQL进阶45讲【20】为什么只改一行的语句,锁这么多? 阳光穿透心脏的1/2处/ 2024年05月07日 22:26/ 0 赞/ 91 阅读
还没有评论,来说两句吧...