本周六直播课《业务并发,锁和死锁》
进技术交流群方式,见文末海报
====正文分割线===
马上要讲到锁的章节,我也去复习下之前自己写的例子。
再看,依然是一眼bug,理解后feature的套路。
贴出来一起复习下。
CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,`d` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);
隔离级别Repeatable-Read。
| session1 | session2 |
session3 |
|
begin; select id from t |
||
|
update t set //Query OK |
||
insert into t |
session2更新id=5这一行直接过了,而session3插入 id=7 的反而被锁住。该锁的不锁,不该锁的乱锁。【“还有王法吗,还有法律~吗”】
实际上还是跟锁范围有关。
关键词:覆盖索引、聚集索引、间隙锁。
==考虑三秒的分割线==
原因:
session1只锁了覆盖索引树c上的记录,没有锁住主键索引上id=5这一行,因此不会锁住session2;
但是这里“覆盖索引树c上的记录”,包括的范围是[5,10), 就把session3堵住了。
==例行海豹:扫码进技术交流群==

原文作者:丁奇3306;如有侵权,请联系管理员删除。