服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 什么是MySQL锁?有哪些锁类型?

什么是MySQL锁?有哪些锁类型?

2024-03-04 14:53小许code Mysql

锁是计算机协调多个进程或线程并发访问某一资源的一种机制,在并发事务下保证数据的正确和唯一性。很多人都一样,在刚开始学习MySQL中锁的时候,网上一查出来一堆,什么表锁、行锁、读锁、写锁、悲观锁、乐观锁等等等,直

为什么需要引入锁

锁是计算机协调多个进程或线程并发访问某一资源的一种机制,在并发事务下保证数据的正确和唯一性。

什么是MySQL锁?有哪些锁类型?图片

锁在 MySQL 中是非常重要的一部分,对 MySQL 的数据访问并发有着举足轻重的影响

MySQL中的锁是在服务器层或存储引擎层实现的,不同的存储引擎的锁机制也有较大的区别。

MySQL锁的实现

很多人都一样,在刚开始学习MySQL中锁的时候,网上一查出来一堆,什么表锁、行锁、读锁、写锁、悲观锁、乐观锁等等等,直接整个人就懵了。

本文我们将以锁粒度的角度去看MySQL锁的分类情况

没事,先看看小许归纳的锁知识大纲,先对锁的位置和锁归属的存储引擎有个前置了解!

什么是MySQL锁?有哪些锁类型?图片

全局锁

全局锁就是对整个数据库实例加锁,MySQL有个全局读锁的命令如下:

flush tables with read lock(FTWRL)

执行后,整个数据库就处于只读状态(不能写入) 了,这个时候其他线程执行数据更新语句(数据的增删改),数据定义语句(建表、修改表结构等)等,都会被阻塞。

解锁命令:

unlock tables

使用场景举例:

主要应用于做全库逻辑备份,原理也很简单在全局锁期间数据或表结构不会被更新,备份后文件的数据与预期也就一样了。

当时加上全局锁,意味着整个数据库都是只读状态,如果备份时间过长就导致其他

Mysql中数据备份使用的命令是mysqldump命令

当使用参数-single-transaction的时候,导出数据之前就会启动一个事务,来确保拿到一致性视图,而由于MVCC的支持,这个过程中数据是可以正常更新的,因为读取的数据在更新前已确认。

页锁

页级锁是 MySQL 中比较独特的一种锁定级别,主要应用于 BDB 存储引擎,我们实际中基本上用的是InnoDB引擎,这里对页锁就不多展开了。

表锁

MyISAM和InnoDB都支持表级锁,但是InnoDB默认的是行级锁。

表锁下面又分了以下四种

什么是MySQL锁?有哪些锁类型?图片

表锁

顾名思义,就是直接对表进行加锁,可以使用下面命令:

//加读锁
lock tables table_name read;
//加写锁
lock tables table_name write;
// 释放当前会话的所有表锁
unlock tables

如果加的是写锁,当对表进行写操作时也会被阻塞,直到写锁被释放。

不过尽量避免在使用 InnoDB 引擎的表使用表锁,因为表锁的颗粒度太大,会影响并发性能。

元数据锁

MySQL5.5引入了元数据锁(meta data lock - MDL),它不需要显式使用,在访问一个表的时候会被自动加上。

  • • 对表数据进行 CRUD 操作时,加 MDL 读锁
  • • 对表结构变更操作的时候,加 MDL 写锁

既然是自动加锁,那释放也是自动的!

事务执行期间,MDL 是一直持有的, 在事务提交后MDL才会释放。

意向锁(Intention Lock)

意向锁主要是在对数据表的行记录加共享锁(S锁)、独占锁(X锁)之前,需要先在表级别加上一个意向锁。

在InnoDB引擎中,当执行查询操作,需要先对表加上「意向共享锁」,然后对该记录加【共享锁】

意向锁有两种类型:

意向共享锁(IS锁):一个事务给一个数据行加共享锁时,必须先获得表的意向共享锁

意向独占锁(IX锁): 一个事务给一个数据行加独占锁时,必须先获得表的意向独占锁

为什么需要先加意向锁?

意向锁的目的是更加快速的判断数据表表里是否有记录被加锁。

比如我们要加【独占表锁】,先在表级别加了【意向独占锁】,那么在加【独占锁】时,直接查该表是否有意向独占锁,如果有就表示表记录存在独占锁,这样就不用去遍历表记录去查看行记录是否存在独占锁了。

加锁命令如下:

//加上意向共享锁,然后对读取的记录加共享锁
select ... lock in share mode;

//先表上加上意向独占锁,然后对读取的记录加独占锁
select ... for update;

AUTO-INC锁

字面意思是用来控制自动自增的锁?

是的,一般来说我们会在表中设置一个字段声明 AUTO_INCREMENT 的自增ID字段。

AUTO-INC锁在自增字段起了个什么作用呢?

当使用INSERT语句插入一条新记录时,MySQL会自动为自增字段加锁,防止其他并发的插入操作同时获取相同的自增值。

其他事务要等待,直到执行完插入语句之后才会释放锁。

这就保证了数据表的 AUTO_INCREMENT 字段的值是连续递增。

好吧,原来这个AUTO_INC锁的作用是这样的,以前我还一直不知道呢!

延伸 · 阅读

精彩推荐