1. Home
  2. Docs
  3. 高性能MySQL
  4. mysql体系架构
  5. 并发控制

并发控制

并发控制

任何时候超过一个查询需要同时更改数据,都会出并发现控制问题。在本章中,MySQL必须在两个级别上执行此操作:服务器级别和存储引擎级别。并发控制是一个非常重要的概念,但这本书并不是禁忌理论,甚至也不是关于MySQL内部的。

读/写锁

从邮箱里读也没那么麻烦。多个客户端同时读取同一个邮箱没有问题;因为他们没有做出改变,所以不太可能出错。但是,如果有人试图在程序读取邮箱时删除25号邮件,会发生什么情况?这取决于具体情况,但在邮箱的一致视图中,区域可能会被损坏。因此,为了安全起见,即使是从邮箱中读取,也需要特别小心。如果您将邮箱视为数据库表,将每条邮件视为一行,则会发现问题在上下文中是相同的,邮箱实际上只是一个简单的数据库表。修改数据库表中的行与删除或更改邮箱中邮件的内容非常相似file.the解决这类货币控制问题的方法是简单的。处理并发读/写访问的系统通常称为实现一个包含软锁类型的锁系统。这些锁通常称为共享锁和附加锁,或读锁和写锁。在不担心实际锁技术的情况下,我们可以将概念描述如下。
读锁标识资源共享或互不阻塞:许多循环可以同时从资源中读取,而不会相互干扰。另一方面,写锁是独占的,即它们同时阻止读锁和其他写锁,因为唯一安全的策略是让一个客户端在给定时间向资源写入,并在客户端写入时防止所有读取。在数据库世界中,锁定总是发生的:MySQL必须防止一个客户端读取一段数据,而另一个客户端正在更改它。它在内部以一种大多数时候都是透明的方式执行锁管理。

锁粒度

提高共享资源并发性的一种方法是更有选择性地锁定资源。与锁定整个资源相比,锁定仅限于部分并发控制包含需要更改的数据。更好的是,只锁定您计划更改的确切数据段。尽可能减少在任何一个时间点锁定的数据量—给定资源的更改会同时发生,只要它们不会相互冲突。

问题是锁会消耗资源。每次锁操作都会得到一个锁,检查锁是否空闲、是否释放锁以及是否很快会产生开销。如果系统花费太多时间管理锁而不是存储和检索数据,则性能可能会受到影响。

A锁定策略是锁定开销和数据安全之间的妥协,这种妥协会影响性能。大多数商业数据库服务器都没有给您太多的选择:您可以在表中使用行级锁,使用多种复杂的方法来提供许多锁的良好性能。

另一方面,MySQL确实提供了选择。它的存储引擎可以实现锁定策略和锁定粒度。锁定管理是针对工程设计的重要决策;将颗粒度固定在一定的水平可以在某些用途下获得更好的性能,但会使发动机不太适合其他用途。因为MySQL提供了多个存储引擎,所以它不需要单一的通用解决方案。让我们看看两种最重要的锁定策略。

表锁

MySQL中可用的最基本的锁定策略,以及最低头的istable锁。ATABLELOCKISANALOGOTHOSTEMailboxLocksDescripte Dear-lier:它锁定整个表。当客户端希望写入表(插入、删除、更新等)时,它会获取写锁。这将保留所有其他读写操作。当Nobody正在写入时,读卡器会获得读锁,这与其他读锁不冲突。

表锁在特定情况下具有良好性能的变体。例如,读本地表锁允许某些类型的并发写操作。写锁的优先级也比读锁高,因此请求写锁将提升到锁队列的前面,即使读卡器区域读取在队列中(写锁可以超越队列中的读锁,但读锁不能超越写锁)。

尽管StorageEngine可以管理Rownlock,但MySQL本身也拥有一系列锁,这些锁实际上是表级别的,用于各种用途。例如,无论存储引擎如何,服务器都会对alter table等语句使用表级锁。

行锁

提供最大并发性(并承载最大的开销)的锁定样式是Row锁。众所周知,行级锁定策略在InnodBand FalconStorage Engine中以及其他存储引擎中都可用。行锁在存储引擎中实现,而不是在服务器中实现(如果需要,请参阅逻辑架构图)。服务器完全不知道存储引擎中安装了锁,而且,正如您稍后在本章和本书中看到的,存储引擎都以自己的方式实现锁定。