介绍下InnoDB的锁机制?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: InnoDB存储引擎的锁分为共享锁(S锁,读锁)和排他锁(X锁,写锁)。共享锁允许多个事务并发读取数据,不允许修改;排他锁允许读取和修改数据,阻止其他事务加锁。SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE分别用于获取共享锁和排他锁。此外,还有意向锁(IX,IS)用于协调行级锁和表级锁的并发问题,意向锁在事务请求锁时自动获取。记录锁锁定索引记录,插入记录锁用于插入操作前的间隙锁定,而AUTO-INC锁确保自增列的有序性。

在InnoDB中,锁可以分为两种级别,一种是共享锁(S锁),另一种是排他锁(X锁)。

共享锁&排他锁

共享锁又称为读锁,由读取操作创建。其他用户可以并发读取数据,但直到所有共享锁都被释放之前,任何事务都无法对数据进行修改(获得数据上的排他锁)。

如果事务T对数据A加上共享锁后,其他事务只能对A再加共享锁,而不能加排他锁。获得共享锁的事务只能读取数据,而不能修改数据。

SELECT ... LOCK IN SHARE MODE;

在查询语句后添加LOCK IN SHARE MODE,MySQL会为查询结果中的每行加上共享锁。只有当没有其他线程对查询结果集中的任意行使用排他锁时,才能成功获取共享锁;否则将被阻塞。其他线程可以读取已经被加了共享锁的表,且这些线程将读取相同版本的数据。

排他锁又称为写锁,一旦事务T对数据A加上排他锁,其他事务就无法再对A加任何类型的锁。获得排他锁的事务既可读取数据,又可修改数据。

SELECT ... FOR UPDATE;

除了S锁X锁之外,InnoDB还有另外两种锁,分别是IX锁和IS锁,这里的"I"代表着"Intention",即意向锁。IX即意向排他锁,IS即意向共享锁。

在查询语句后添加FOR UPDATE,MySQL会对查询命中的每条记录都加排他锁(如果有索引,则通过索引加锁;如果没有索引,则会锁定整个表)。只有当没有其他线程对查询结果集中的任何一行使用排他锁时,才能成功申请排他锁;否则将被阻塞。

意向锁

在MySQL的InnoDB引擎中,支持多种锁级别,包括行级锁和表级锁。当多个事务需要访问共享资源时,如果每个事务都直接请求锁,可能会导致彼此相互阻塞,甚至引发死锁。

举个例子:

事务A对表Table1中的某一行加上了行级锁,这导致该行只能读取而不能修改。与此同时,事务B试图申请对Table1的表级锁。如果事务B成功获取表级锁,那么它就能修改表中的任意一行记录,从而引发冲突。

为解决这一问题,事务B在申请Table1的表级锁时,需要先检查是否有其他事务已经加了行级锁。然而,事务B无法简单地遍历表中所有数据逐行判断是否已被锁定,这样效率太低了。

为了解决这一问题,MySQL引入了意向锁机制。意向锁作为一种锁机制,在数据库管理系统中旨在协调不同锁粒度(如行级锁和表级锁)之间的并发问题。(对于同一锁粒度内的并发问题,如多个行级锁之间的冲突,则通过行级互斥锁来解决。)

注意:

  1. 意向锁并非直接锁定资源,而是用于通知其他事务,以防止它们在相同资源上设置不兼容的锁。
  2. 意向锁不是由用户直接请求的,而是由MySQL系统管理的。

当一个事务请求获取行级锁或表级锁时,MySQL会自动获取相应表的意向锁。这样一来,其他事务在请求表锁时,可以先通过该意向锁探知是否有已经加锁,并根据意向锁的类型(意向共享锁/意向排它锁)判断自身是否可获取锁。这种方式在不阻塞其他事务的情况下,为当前事务锁定资源。

意向锁有两种类型:意向共享锁和意向排它锁。

  1. 意向共享锁:代表事务打算对资源设置共享锁(读锁)。通常用于暗示事务打算读取资源,不希望在读取时有其他事务设置排它锁。
  2. 意向排它锁:代表事务打算对资源设置排它锁(写锁)。这表明事务计划修改资源,不希望其他事务同时设置共享或排它锁。

意向锁是表级锁,在触发意向锁的事务提交或回滚后会释放。

以下是MySQL官网上给出的这几种锁之间的冲突关系:

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

image.png

记录锁

记录锁(Record Lock)是一种加在索引记录上的锁,用于保护特定行数据的完整性。例如,对于语句 SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;,将会对满足条件 c1=10 的记录加锁,以防止其他事务对该行进行插入、更新或删除操作。

尽管记录锁通常被称为行级锁,但需要特别注意的是,它实际上锁定的是索引记录而非数据行本身。此外,记录锁仅限于锁定索引

当表中不存在索引时该如何处理?InnoDB 引擎会自动创建一个隐藏的聚簇索引,并使用该索引进行记录锁定。

若表中未定义主键,MySQL会默认选择一个唯一的非空索引作为聚簇索引。若不存在适用的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。

关于记录锁的加锁原则。感兴趣的小伙伴一键三连。后续可以出一片文章。

插入记录锁

插入意向锁是一种由插入操作在行插入之前设置的间隙锁。这种锁表明了插入的意图,以这样一种方式,如果多个事务尝试插入到同一索引间隙但不在间隙内的相同位置,则它们不需要相互等待。

举例来说,假设存在索引记录的值为4和7。当不同事务分别尝试插入值为5和6时,它们会在获取插入行的独占锁之前,各自使用插入意向锁锁定4和7之间的间隙。由于它们插入的行并不冲突,因此它们不会相互阻塞。然而,如果它们都试图插入6,那么就会发生阻塞情况。

AUTO-INC 锁

AUTO-INC 锁是一种特殊的表级锁,由向包含 AUTO_INCREMENT 列的表插入数据的事务所获取。在最简单的情况下,如果一个事务正在向表中插入值,其他任何事务都必须等待,以便执行它们自己的插入操作,这样第一个事务插入的行就会接收到连续的主键值。

innodb_autoinc_lock_mode 变量控制用于自增锁定的算法。它允许你在可预测的自增值序列和插入操作的最大并发性之间进行权衡。

在MySQL 5.1之前,AUTO-INC锁是一种表级锁。

如有问题,欢迎微信搜索【码上遇见你】。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10月前
|
存储 缓存 关系型数据库
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
376 0
|
20天前
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
|
20天前
|
存储 SQL 算法
Innodb锁机制:Next-Key Lock 浅谈
Innodb锁机制:Next-Key Lock 浅谈
46 0
|
20天前
|
存储 算法 关系型数据库
MySQL相关(八)- innodb行级锁深入剖析
MySQL相关(八)- innodb行级锁深入剖析
53 0
|
20天前
|
存储 算法 关系型数据库
MySQL相关(七)- innodb 锁的介绍及使用
MySQL相关(七)- innodb 锁的介绍及使用
34 0
|
20天前
|
存储 SQL 关系型数据库
MySQL之深入InnoDB存储引擎——Checkpoint机制
一、引入 由于页的操作首先都是在缓冲池中完成的,那么如果一条DML语句改变了页中的记录,那么此时页就是脏的,即缓冲池中页的版本要比磁盘的新。那么数据库需要将新版本的页刷新到磁盘。倘若每次一个页发生变化就刷新,那么开销会很大,若热点数据集中在某几个页中,那么数据库的性能将变得非常差。 同时如果在缓冲池将新版本的页刷新到磁盘时发生了宕机,那么数据就不能恢复了。为了避免发生数据丢失的问题,当前事务数据库普遍都采用了 Write Ahead Log 策略,即当事务提交时,先写重做日志,再修改页。当由于发生宕机而导致数据丢失时,通过重做日志来完成数据的恢复,从而满足事务的持久性要求。
|
9月前
|
存储 监控 关系型数据库
InnoDB中的各种锁及其应用
InnoDB中的各种锁及其应用
|
关系型数据库
InnoDB行级锁的分析
在主键上的查询 下面做过实验
|
存储 关系型数据库 数据库
|
存储 关系型数据库 MySQL
InnoDB的锁机制是什么?底层原理是什么?
InnoDB的锁机制是什么?底层原理是什么?
108 0