暂无图片
rc下神奇的锁等待 mysql 8.0
我来答
分享
暂无图片 匿名用户
rc下神奇的锁等待 mysql 8.0

mysql> show create table t11;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t11 | CREATE TABLE `t11` (
`id` int(11) NOT NULL,
`type_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-------------------------------------------


mysql> select * from t11;
+----+---------+
| id | type_id |
+----+---------+
| 1 | 3 |
| 2 | 3 |
| 3 | 4 |
| 4 | 3 |
| 5 | 4 |
| 6 | 4 |
| 7 | 5 |
| 8 | 5 |
| 9 | 4 |
| 12 | 4 |
| 15 | 4 |
+----+---------+


mysql> select * from t11 where type_id=4 for update; --sess1 ,rc
+----+---------+
| id | type_id |
+----+---------+
| 3 | 4 |
| 5 | 4 |
| 6 | 4 |
| 9 | 4 |
| 12 | 4 |
| 15 | 4 |
+----+---------+

mysql> select * from t11 where type_id=3 for update; --sess 2,rc
+----+---------+
| id | type_id |
+----+---------+
| 1 | 3 |
| 2 | 3 |
| 4 | 3 |
+----+---------+

rc下,sess1 ,sess2 为什么会等待了,会在id=3的记录上发生了等待?

data_locks中,单独看sess1 是6条行锁,sess2 是3个行锁,并且没有id=3上的锁 ,

为什么sess2 会请求id=3上的行锁呢? 

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
chengang

原因很简单。 type_id是没有索引的

那么mysql 会对扫描的行加锁。RC与RR的区别是 RC会释放不符合条件的行。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏