美文网首页Mysql
InnoDB行锁升级为表锁的问题

InnoDB行锁升级为表锁的问题

作者: 我叫于牛逼 | 来源:发表于2020-03-25 14:55 被阅读0次

前几天跟朋友聊天,聊起Mysql锁的问题。他突然问我为什么行锁会变成表锁。
由于解释半天,他还没搞明白,因此用图形化界面给他演示一下

首先准备一张简单的测试表

0F3B30CAA2525949EFA66E4EAC001A32.jpg

准备两个窗体,且同时开启事务


77AA6BF61F044740E9091656B4178740.jpg

Session 1
begin;
select * from t1 where name = '张三' for update;

ROLLBACK
COMMIT

/****************************************************************************/
Session 2
begin;
select * from t1 where id = 3 for update;

ROLLBACK
COMMIT

session2 因为行锁升级为表锁一直在等待

InnoDB 行级锁是通过给索引上的索引项加锁来实现的,InnoDB行级锁只有通过索引条件检索数据,才使用行级锁;否则,InnoDB使用表锁 在不通过索引(主 键)条件查询的时候,InnoDB是表锁而不是行锁。

总结:就是在没有使用索引的情况下InnoDB就会使用表级锁(共享锁不会有这个情况)

最后给出事务使用的几点建议

  • 控制事务大小,减少锁定的资源量和锁定时间长度。
  • 所有的数据检索都通过索引来完成,从而避免因为无法通过索引加锁而升级为表锁。
  • 减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定的数据。
  • 在业务条件允许下,尽量使用较低隔离级别的事务隔离。减少隔离级别带来的附加成本。
  • 合理使用索引,让innodb在索引上面加锁的时候更加准确。
  • 在应用中尽可能做到访问的顺序执行。
  • 如果容易死锁,就可以考虑使用表锁来减少死锁的概率

相关文章

  • 行锁

    特点 偏向InnoDB存储引擎 索引失效会使行锁变成表锁 (如varchar型未加单引号) 即无索引行锁升级为表锁...

  • 27、说说什么是锁升级?

    说说什么是锁升级? MySQL 行锁只能加在索引上,如果操作不走索引,就会升级为表锁。因为 InnoDB 的行锁是...

  • InnoDB行锁升级为表锁的问题

    前几天跟朋友聊天,聊起Mysql锁的问题。他突然问我为什么行锁会变成表锁。由于解释半天,他还没搞明白,因此用图形化...

  • MySQL技术内幕InnoDB存储引擎阅读相关笔记-锁

    一、InnoDB锁 对于MyISAM引擎来说,其锁是表锁。InnoDB引擎提供行锁。 1、InnoDB行锁 1)、...

  • 校招面试题mysql锁总结

    目录 锁定义 锁分类 读锁和写锁 表锁和行锁 InnoDB共享锁和排他锁 InnoDB意向锁和排他锁 InnoDB...

  • Innodb的锁

    Innodb的锁是行级锁 mysql delete是否会锁表 MySQL的InnoDB存储引擎支持行级锁,Inno...

  • MySQL的锁与事务

    MyISAM和InnoDB锁区别 MyISAM默认行级锁,不支持表级锁InnoDB都支持这里我们假设X为排他锁,S...

  • 锁升级

    什么是锁升级?(Lock Escalation) 指将当前锁的粒度降低。比如: 把行锁升级为页锁。 将页锁升级为表...

  • 总结Mysql中的锁

    MySQL中的锁 概述 MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁 表级锁:开销小,加锁快,不会...

  • InnoDB引擎的行锁和表锁

    在Mysql中,Innodb数据引擎支持行锁和表锁,Myisam数据引擎只支持表锁 1 行锁和表锁 行锁是通过索引...

网友评论

    本文标题:InnoDB行锁升级为表锁的问题

    本文链接:https://www.haomeiwen.com/subject/wogfpxtx.html