MySQL不走索引时的行锁升级表锁的问题

周昭鹏 2020-06-30 03:21:06
我在网上看到一篇博客写到:

当 SQL 语句无法使用索引时,会进行全表扫描,这个时候 MySQL 会给整张表的所有数据行加记录锁,再由 MySQL Server 层进行过滤。但是,在 MySQL Server 层进行过滤的时候,如果发现不满足 WHERE 条件,会释放对应记录的锁。这样做,保证了最后只会持有满足条件记录上的锁,但是每条记录的加锁操作还是不能省略的。


MySQL 使用 InnoDB 引擎时,当语句不走索引进而导致全表扫描时,是直接加表锁?还是在每条记录上加记录锁?还是MySQL中的表锁就是用所有记录的锁形成的?

博客这段话是否正确,如果正确,按照我都理解,MySQL为表直接加锁的代价难道不比给每个记录都加锁的代价小?
...全文
541 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪饼没有雪 2021-01-06
  • 打赏
  • 举报
回复
如果事务A 在tuple t上持有排他锁定,来自不同事务B的对t上任一类型的锁的请求不被马上许可,取而代之地,事务B 不得不等待事务t释放在tuple t上的锁。 按我的理解是直接堵塞了,并没有每个加记录锁
xiaoxiangqing 2020-07-01
  • 打赏
  • 举报
回复
是有可能,取了数据后会释放表锁

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧