高性能 MySQL(二):并发控制(锁)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 无论何时,当多个进程或线程并发访问同一资源时,就会产生并发控制的问题。在数据库系统中,数据也是一种多用户共享的资源,为了保证数据的一致性,需要对数据操作进行并发控制,而数据库系统通常使用锁(Lock)来控制并发问题。

大家好,我是水滴~~

无论何时,当多个进程或线程并发访问同一资源时,就会产生并发控制的问题。在数据库系统中,数据也是一种多用户共享的资源,为了保证数据的一致性,需要对数据操作进行并发控制,而数据库系统通常使用(Lock)来控制并发问题。

1 读写锁

当我们从表中读取一条记录时,即使同一时刻有多个用户并发读取,也不会有什么问题,因为读取并不会修改数据,所以不会出错。但当一个用户读取,而别一个用户试图删掉数据,这就会造成读取到不一致的数据。

所以无论是读(查)还是写(增、删、改)都应该有相应的锁机制。这两种类型的锁通常被称为共享锁(Shared Lock)和排他锁(Exclusive Lock),也叫做读锁(Read Lock)和写锁(Write Lock)。

1.1 共享锁/读锁

读锁是共享的,或者说是相互不阻塞的。多个用户在同一时刻可以同时读取同一资源,而互不干扰。

MySQL 对读取的记录加共享锁,在 SQL 语句后面加lock in share mode,例如:

select ... lock in share mode;

1.2 排他锁/写锁

写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁。并且读锁在未释放前,写锁也会被阻塞,直到读锁被释放。

MySQL 对读取的记录加排他锁,在 SQL 语句后面加for update,例如:

select ... for update;

2 锁的使用

我们使用一些 SQL 来操作共享锁和排他锁。下图是一个user表,表中有10条数据,就使用这张表来演示下锁的使用。

2.1 读—>读

A窗口先开启事务,再使用读锁

B窗口再使用读锁,我们发现B窗口的查询并没有被阻塞,也就是说读锁与读锁之前互不影响。

7a3d67fcfbf71ced49f4a3222dbb48ce_%E8%AF%BB-%E8%AF%BB_auth_key=1686634524-qP9EdedMRa9YBYq74QWtqv-0-daeb7e5130f2bdc2e95ead696e96a434&file_size=203309.gif

2.2 读—>写

A窗口先开启事务,再使用读锁

B窗口再使用写锁,我们发现B窗口被阻塞住了;

A窗口提交事务后(释放读锁),B窗口立马输出结果。

fbf988b27f7ba4bea841a7bb7b734732_%E8%AF%BB-%E5%86%99_auth_key=1686634596-3uGZXtzLDkMcNfPhcCwxsq-0-218cedf2469a53480ab5b939bfec0e1b&file_size=223183.gif

2.3 写—>读

A窗口先开启事务,再使用写锁

B窗口再使用读锁,然而B窗口同样被阻塞住了;

A窗口提交事务后(释放写锁),B窗口立马输出结果。

0056b284e955866cf298d7c636d2a2a4_%E5%86%99-%E8%AF%BB_auth_key=1686634611-27Dh4M9WuqLjiKretxHixh-0-092527cb6ecfc7d1455c8726479ede79&file_size=245069.gif

2.4 写—>写

A窗口先开启事务,再使用写锁

B窗口再使用写锁,然而B窗口也是被阻塞住了;

A窗口提交事务后(释放写锁),B窗口立马输出结果。

5cff99373acd9360e31523a12a49ae55_%E5%86%99-%E5%86%99_auth_key=1686634620-63XfpPYeV8VW2cuJYb5mn7-0-04c86847b473399f32cd7464ab1d0d1a&file_size=220005.gif

通过上面的使用,我们也能看出结论。读锁与读锁之前互不影响;而写锁与其他任意组合(使用顺序),都会有影响。

3 锁粒度

为了尽可能提高数据库的并发性,每次锁定的数据范围越小,理论上并发性就越高。

问题时加锁本身也是需要消耗资源的。锁的各种操作,包括获得锁、检查锁是否已释放、释放锁等,都会增加系统的开锁。如果系统花费大量的时间来管理锁,而不是存取数据,那么系统的性能也会受到影响。

所以 MySQL 提供了多种存储引擎,每种存储引擎都有自己的锁策略和锁粒度,我们可以根据自己的业务需求来选择。

下面介绍两种最重要的锁策略。

3.1 表锁

表锁(Table Lock)是 MySQL 中最基本的锁策略,并且是开锁最小的策略(粒度比较大)。

表锁是 MySQL 服务层实现的,它不依赖于存储引擎,不管你用的是哪种存储引擎,表锁的策略都是一样的。

由于表锁一次会将整个表锁住,所以可以很好的避免死锁问题。当然,锁的粒度大所带来最大的负面影响是并发率比较低。

3.2 行锁

行锁(Row Lock)可以最大程度地支持并发处理,但同时也带来了最大的锁开锁。

在 MySQL 中,行级锁只在存储引擎层实现,比如 InnoDB 和 XtraDB 等。服务器层完全不了解存储引擎中的行锁实现。

image.png

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
存储 算法 关系型数据库
MySQL事务与锁,看这一篇就够了!
MySQL事务与锁,看这一篇就够了!
|
9天前
|
存储 关系型数据库 MySQL
MySQL的锁机制
MySQL的锁机制主要用于管理并发事务对数据的一致性和完整性的访问控制
25 4
|
11天前
|
SQL 安全 关系型数据库
【Mysql-12】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】
【Mysql-12】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】
|
14天前
|
存储 SQL 关系型数据库
|
17天前
|
关系型数据库 MySQL 数据库
MySQL锁解密:读锁与写锁
【4月更文挑战第20天】
24 1
|
17天前
|
关系型数据库 MySQL 数据库
|
17天前
|
算法 关系型数据库 MySQL
|
17天前
|
SQL 关系型数据库 MySQL
MySQL锁:解析隐式锁与显式锁
【4月更文挑战第20天】
38 0
|
2天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
10 0
|
2天前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections

推荐镜像

更多