
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
MySQL数据库因为运行的环境和需求不一样等原因我们会使用各种类型的锁,而我们今天就通过案例分析来简单了解一下,MySQL数据库常用锁的类型分析。
1、表锁
表锁,顾名思义就是对某个表加锁。
那什么时候会使用表锁呢?
一般情况是对应的存储引擎没有行级锁(例如:MyIASM),或者是对应的SQL语句没有匹配到索引。
对于一种情况而言,因为对应存储引擎不支持行锁,所以只能是使用更粗粒度的锁来实现,这也比较好理解。
对于二种情况而言,如果存储引擎支持行锁,但对应的SQL就没有使用索引,那么此时也是会全表扫描,那此时也是会使用表锁。例如下面的语句没有指定查询列,或者指定了查询列但是并没有用到索引,那么也是会直接锁定整个表。
上面说的索引,可以说是判断是否会用行级锁的关键。但我想到一个问题:如果查询或更新用到了索引,但是查询或更新的数据特别多,占全表的80%甚至更多,这时候是会用表锁,还是行锁呢?这是一个很有意思的问题,感兴趣的朋友自行弄个测试表验证一下,后续有机会我们再聊聊这个问题。
2、元数据锁
元数据,指的是我们的表结构这些元数据。元数据锁(MetadataLock)自然是执行DDL表结构变更语句时,我们对表加上的一个锁了。
那什么时候会使用元数据锁这个表级锁呢?
当我们对一个表做增删改查操作的时候,会加上MDL读锁;当我们要对表结构做变更时,就会加MDL写锁。
3、意向锁
意向锁,本质上就是空间换时间的产物,是为了提高行锁效率的一个东西。
在InnoDB中,我们对某条记录进行锁定时,为了提高并发度,通常都只是锁定这一行记录,而不是锁定整个表。而当我们需要为整个表加X锁的时候,我们就需要遍历整个表的记录,如果每条记录都没有被加锁,才可以给整个表加X锁。而这个遍历过程就很费时间,这时候就有了意向锁的诞生。
意向锁其实就是标记这个表有没有被锁,如果有某条记录被锁住了,那么就必须获取该表的意向锁。所以当我们需要判断这个表的记录有没有被加锁时,直接判断意向锁就可以了,减少了遍历的时间,提高了效率,是的用空间换时间的做法。
那么什么时候会用到意向锁呢?
很简单,就是在对表中的行记录加锁的时候,就会用到意向锁。
4、行级锁
千呼万唤,终于来到了行级锁。
要知道的是,行级锁是存储引擎级别的锁,需要存储引擎支持才有效。目前MyISAM存储引擎不支持行级锁,而Innodb存储引擎则支持行级锁。而全局锁、表级锁,则是MySQL层面就支持的锁。
那么什么时候会使用行级锁呢?
当增删改查匹配到索引时,Innodb会使用行级锁。
如果没有匹配不到索引,那么就会直接使用表级锁。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。