前言
今天来讲一讲 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