前言

今天来讲一讲 MySQL 的锁,一个简单的入门。

MySQL 锁,分为全局锁,表级锁,行级锁,三个锁按照名字的颗粒度来算是越来越小的。锁越大性能越差,InnoDB 默认的是行级锁,而 MyLSAM 默认的是表级锁,这也是 MySQL 现在使用 InnoDB 的原因之一。


全局锁

当使用全局锁的时候,整个数据库都会被锁着。只能进行读的操作。
像这两种操作都会被堵塞:

  • 对数据的增删改:insert,delete,update 等语句。
  • 对表结构的修改:alter table、drop table 等语句。

为什么时候需要使用全局锁呢?

  • 全库逻辑备份。

当我们使用备份的时候可以加入全局锁,这样子的话我们的数据在备份的时候就不会出现修改。
但是呢?这个备份的期间是比较长的,这会影响到业务,导致业务的停滞。

有解决方法!!!
如果,数据库引擎是支持可重复读的隔离级别。那么在备份数据库之前开启事务,那么就会先创建 Read View。MVCC 机制的帮助下,其他事务也可以更新数据,但是不会影响备份数据的 ReadView。这样就可以备份数据的同时不会影响到业务的执行。

表级锁

MyLSAM 支持的表级锁。

  • 给表加上读锁也就是共享锁。
  • 给表加上写锁也就是独占锁。

元数据锁(DML)

  • 当对一张表进行 CRUD 操作时,加的是 MDL 读锁。
  • 当对一张表的结构变更的时候,加的是 MDL 写锁。

意向锁

  • Innodb 在表对某些记录加上共享锁之前,都会先在表级别上加上一个意向共享锁。
  • Innodb 在表对某些记录加上独占锁之前,都会先在表级别上加上一个意向独占锁。

意向锁的目的是为了快速判断表里是否有记录被加锁。

AUTO-INC 锁

行级锁

InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。


总结

MySQL 锁,分为全局锁,表级锁,行级锁,三个锁按照名字的颗粒度来算是越来越小的。锁越大性能越差,InnoDB 默认的是行级锁,而 MyLSAM 默认的是表级锁,这也是 MySQL 现在使用 InnoDB 的原因之一。

对锁的概念即使看了多篇文章还是存在疑惑,知识不过脑,往后会接着完善。


有启发点个赞 🌹

好文章不要错过,最近給大家分享的文章

MySQL的基础知识

1.MySQL的基础架构
2.SQL语句的执行流程
3.MySQL 的存储引擎

MySQL 索引

1.MySQL索引入门(一文搞定)
2.MySQL索引面试题(高频)

MySQL 事务
1.MySQL事务(基础入门)(高频考点)
2.MySQL事务的隔离级别(高频面试题)
3.事务的MVCC机制

预计下篇分享:MySQL 日志

本篇参考:小林coding

03-04 18:03