暂无图片
MySQL数据库中,为啥后续插入 amount=150 的记录会被阻塞?
我来答
分享
暂无图片 匿名用户
MySQL数据库中,为啥后续插入 amount=150 的记录会被阻塞?

在 REPEATABLE READ 隔离级别下,执行:

SELECT * FROM orders WHERE amount BETWEEN 100 AND 200 FOR UPDATE;

为什么后续插入 amount=150 的记录会被阻塞?

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

如果 amount 有二级索引,并且执行计划是索引范围扫描,则会对 amount 索引 between and 的范围加 gap lock 和行锁 ,gap lock 阻止数据插入到这个范围之内,所以如果事务未提交,则会阻塞后续插入。

如果 amount 没有索引,执行计划会全表扫描整张表,则会对主键索引所有数据加行锁和 gap lock ,那么事务未提交,则阻塞后续插入。


从可重复读的意义上来说,为了保证该事务中每次查询返回相同的结果,必须通过加锁来保证。

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