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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 无论何时,当多个进程或线程并发访问同一资源时,就会产生并发控制的问题。在数据库系统中,数据也是一种多用户共享的资源,为了保证数据的一致性,需要对数据操作进行并发控制,而数据库系统通常使用锁(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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 关系型数据库 MySQL
MySQL MVCC全面解读:掌握并发控制的核心机制
【10月更文挑战第15天】 在数据库管理系统中,MySQL的InnoDB存储引擎采用了一种称为MVCC(Multi-Version Concurrency Control,多版本并发控制)的技术来处理事务的并发访问。MVCC不仅提高了数据库的并发性能,还保证了事务的隔离性。本文将深入探讨MySQL中的MVCC机制,为你在面试中遇到的相关问题提供全面的解答。
248 2
|
3月前
|
缓存 关系型数据库 MySQL
MySQL并发支撑底层Buffer Pool机制详解
【10月更文挑战第18天】在数据库系统中,磁盘IO操作是性能瓶颈之一。为了提高数据访问速度,减少磁盘IO,MySQL引入了缓存机制。其中,Buffer Pool是InnoDB存储引擎中用于缓存磁盘上的数据页和索引页的内存区域。通过缓存频繁访问的数据和索引,Buffer Pool能够显著提高数据库的读写性能。
179 2
|
11天前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
17天前
|
SQL 存储 关系型数据库
Mysql并发控制和日志
通过深入理解和应用 MySQL 的并发控制和日志管理技术,您可以显著提升数据库系统的效率和稳定性。
72 10
|
2月前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
186 3
|
3月前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
163 1
|
3月前
|
监控 关系型数据库 MySQL
MySQL并发控制与管理
【10月更文挑战第17天】MySQL并发控制与管理
46 0
|
3月前
|
存储 监控 关系型数据库
MySQL并发控制与管理:优化数据库性能的关键
【10月更文挑战第17天】MySQL并发控制与管理:优化数据库性能的关键
360 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL锁,锁的到底是什么?
【10月更文挑战第16天】MySQL 锁锁定的是与数据和资源相关的对象,其目的是为了保证数据的一致性、避免冲突,并在并发环境下合理协调事务或操作的执行。理解锁的对象和意义对于优化数据库性能、处理并发问题至关重要。
114 0
|
3月前
|
关系型数据库 MySQL 数据库
mysql锁详解
通过理解并合理运用MySQL中的锁机制,开发者可以有效管理数据库并发访问,平衡性能与数据一致性需求。更多关于MySQL锁的深入探讨和最佳实践,请参考专业的数据库管理资源[[深入MySQL锁机制详解
66 0