`
风雪涟漪
  • 浏览: 508713 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9069
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18486
社区版块
存档分类
最新评论

MySQL 架构 - 并发控制

阅读更多

并发控制

可能会出现同时修改同一数据的情况发生。这就涉及到了并发控制问题。MySQL通过两个级别解决这个问题。服务器级别和存储引擎级别。并发控制在理论上来说都是一个庞大的话题。这不是本书的关注点。我们所讲到的是一个MySQL处理并发读和并发写的一个简单的介绍。

 

我们会用一个Unix系统下的EMAIL邮箱做为例子。经典的邮箱文件格式是很简单的。一个邮箱的所有信息都是一个接着一个连接起来的。这非常容易读取和解析mail的信息。邮件的分发也很简单。只要把信息添加到文件的内容的最后就可以了。

 

但是如果出现两个操作同时对一个邮箱进行分发操作会怎样?答案是肯定的,信息格式必然被破坏,两条混乱的信息插入到文件的最后。还好邮件分发程序用锁机制解决了这个问题。如果第二个消息要添加,就会遇到文件被锁。它必须要获得锁,才能分发这个信息。

 

读取锁和写入锁

从邮箱读取并不能引发什么错误。因为这些操作没有做任何的修改。如果删除操作和读邮箱操作同时进行的时候,会怎样呢?视情况而定,但是可能会读取一个毁坏的不连贯的信息。因此,为了安全,读取邮箱也要格外的小心。

 

如果把邮箱看做数据库的表,每条信息看做一行。就会发现这两种情况下错误是一样的。在很多情况下,一个邮箱就是简单的一张表。修改表的行和修改邮箱的信息是非常相似的。

 

对于这种经典的错误,解决方案也很简单。一般都是实现了两种锁。这两种锁一般叫做共享锁(shared locks)以及排它锁(exclusive locks)或者可以叫做读取锁(read locks)和写入锁(write locks)。

 

没必要担心锁的技术。我们会描述这个概念的。读取锁的资源是共享的,它们之间是非阻塞的。许多Clients同时读取同一数据,彼此之间并不会影响。写入锁,意思就是一种独占的意思。如,它们阻塞了读取锁和其他的写入锁。因为在同一时间只能有一个Client写入资源。避免在写的同时,数据被读取。

 

在数据库中,总会有锁的现象发生。MySQL会避免一个Client读取的同时,另一个进行修改。一般锁都是通过某种方式内部管理的,这种方式大多数时候是透明的。

 

锁的颗粒度

大部分都选择锁的对象这个方法来提高共享资源的并发性。要锁定你要更改的数据,而不是锁定整个资源。最佳的情况下,是锁定准确的数据。要尽可能的缩小锁定数据的范围。

 

锁的问题就是资源消耗。每个锁的操作,如得到一个锁,检查这个锁是否空闲,释放锁等等。额外的开销挺大。如果系统花费大量的时间来管理锁,而不是用来存储和获取数据,那么性能是很糟糕的。

 

锁策略一般是在锁的额外开销和安全性取一个折中的方法。这个策略会影响到性能。大部分商业的数据库不会给你更多的选择:你获得是行级别的锁。有大量的复杂的算法使得其具有很高的性能。

 

MySQL提供了更多的选择。它的存储引擎提供了自己的锁策略和锁的颗粒度。锁管理在存储引擎的设计中是非常重要的。

锁的颗粒度在某一级别,对于某些的操作有很大的性能提升。然而可能对于其他的引擎就不太适合了。因为MySQL本身提供了多个存储引擎。所以不会有一个通用的解决方案。让我们来看下比较重要的两个锁的策略。

 

表锁

在MySQL中,这是最基本的锁的策略了。消耗资源最少的就是表锁了。表锁和上面所描述的邮箱锁是相似的,它是把整个表进行锁定。当一个Client要操作表(Insert,delete,update等)。它获得了一个写锁。这样其他Client就不能操作这个表了。当没有Client执行写的操作。读取操作会得到一个读取锁。它并不会和其他的读取锁相冲突。

 

表锁的许多变化在特定的条件下有很好的性能。举个例子,READ LOCAL 表锁允许一些类型的写入操作并发执行。写入锁得优先级高于读取锁。因此一个请求的写入锁在队列中必会超过读取锁。(写入锁在队列中会超过读取锁,但是读取锁不会超过写入锁)。

 

虽然存储引擎能管理自己的锁,但是MySQL本身也使用了不同的表锁来提高效率。示例, 服务器对于ALTER TABLE这个语句使用了表锁。而不管存储引擎的锁管理。

 

行锁

这种锁可以带来最好的并发性,但是对资源的消耗也是最大的。行锁这种策略是非常熟悉的。在InnoDB和Falcon存储引擎

中可以使用行锁。行锁是存储引擎实现的。并不是服务器实现。服务器完全不知道存储引擎锁的实现。在以后的教程中会知道存储引擎有自己实现锁的方式。

 

 

分享到:
评论

相关推荐

    mysql-connector-java-8.0.24

    MySQL Connector/J 8.0.24 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java...最后,了解并遵循MySQL的最佳实践,如合理设计数据库架构、索引管理和事务处理,有助于提升整个系统的稳定性和效率。

    MySQL架构执行与SQL性能优化 MySQL高并发详解 MySQL数据库优化训练营四期课程

    MySQL架构执行与SQL性能优化-MySQL高并发详解课程,课程的目标简单明确,核心就是MySQL的性能优化与高并发。课程内容进行了精华的浓缩,有四大内容主旨,MySQL架构与执行流程,MySQL索引原理详解,MySQL事务原理与...

    MySQL-5.5.28-winx64安装包以及说明文档

    - **性能优化**:监控和调整MySQL的性能参数,如innodb_buffer_pool_size、query_cache_size等,以及合理设计数据库架构,可以显著提升系统性能。 - **复制与集群**:MySQL支持主从复制和集群配置,用于提高可用性...

    mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz

    在本篇文章中,我们将深入探讨针对arm架构的MySQL 5.7.32安装文件"mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz"。 首先,让我们了解"mysql-5.7.32-linux-glibc-2.28-aarch64"这个文件名的含义。"mysql-5.7.32...

    mysql-8.0.31-winx64-debug-test.zip

    对于MySQL这样的数据库系统,测试套件通常包括各种SQL查询、并发操作和性能测试,确保其在不同场景下的正确性和稳定性。 6. **mysql-8.0.31-winx64**:这个文件名可能代表压缩包解压后的根目录,其中包含了所有...

    mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz

    这个压缩包文件"mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz"包含了适用于Linux操作系统的MySQL 5.7.31稳定版的二进制安装包,特别为glibc 2.12库优化,适用于基于x86_64架构的系统。这里我们将深入探讨MySQL 5.7的...

    MySQL-5.6.17-liunx-32bit

    此外,还引入了InnoDB存储引擎的增强,如更高的并发性、更少的锁冲突以及更好的内存管理,这些都为数据库性能带来了显著提升。 在Linux 32位系统上安装MySQL 5.6.17的步骤通常包括以下阶段: 1. **下载**:首先,...

    MySQL逻辑架构-存储引擎-用户权限密码详解

    服务层是MySQL架构的最上层,主要负责客户端的连接处理、授权认证以及安全检查,为客户端提供访问MySQL服务的接口。 核心层主要包含查询解析、分析优化SQL语句,以及缓存查询结果等功能,是MySQL处理数据的核心部分...

    mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

    - **InnoDB存储引擎增强**:MySQL 5.7对InnoDB存储引擎进行了大量改进,包括更快的插入速度、更高的并发性和更小的数据文件占用空间。 - **JSON支持**:增加了对JSON数据类型的内置支持,允许用户在关系数据库中...

    mysql-boost-5.7.24.tar.gz

    在LNMP环境中,安装MySQL-Boost可以提高MySQL的性能,尤其在高并发和大数据量的场景下。同时,由于是源码编译安装,可以根据系统环境进行定制化配置,以满足特定需求。记得在安装过程中注意权限问题,以及正确配置...

    mysql5.7-arm64.zip

    标题中的“mysql5.7-arm64.zip”指的是MySQL数据库管理系统的一个特定版本,即5.7版,适配于ARM64架构的处理器。描述提到的“银河麒麟系统”是中国自主研发的操作系统,主要针对服务器和桌面环境,具有良好的安全性...

    MySQL 5.5.28-1 linux2.6.x86_64.rpm

    1. **InnoDB存储引擎增强**:InnoDB是MySQL中支持事务处理的主要存储引擎,5.5版本对其进行了优化,提高了并发性能,并增强了对ACID(原子性、一致性、隔离性、持久性)的遵循。 2. **性能提升**:包括查询优化器的...

    最新版windows mysql-8.0.20-winx64.zip

    MySQL 8.0中的InnoDB存储引擎有了重大改进,包括更快的插入速度、更高的并发性能以及对事务处理的支持。InnoDB也是MySQL的默认存储引擎,提供行级锁定和ACID合规性,适合大多数业务应用。 6. **优化器改进**: ...

    MySQL8.4.0 LTS(mysql-8.4.0-solaris11-sparc-64bit.tar.gz)

    2. **InnoDB存储引擎升级**:作为MySQL的核心存储引擎,InnoDB在8.4.0版本中可能引入了更多并发控制策略,如改进的自适应哈希索引、更有效的事务处理和更好的行锁定机制,以提高多用户环境下的并发性能。 3. **安全...

    mysql源码(mysql-8.2.0.zip)

    8. **插件系统**:MySQL支持插件化架构,开发者可以通过编写插件扩展其功能。源码中的`plugin`目录展示了如何设计和实现插件。 9. **存储过程与触发器**:MySQL支持创建存储过程和触发器,这些是数据库级别的程序...

    mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz

    这个特定的压缩包"mysql-5.6.38-linux-glibc2.12-x86_64.tar.gz"是为基于Linux的系统设计的,特别是那些使用glibc(GNU C库)版本2.12或更高版本的32位x86架构的系统。glibc是Linux系统中的核心部分,提供了许多系统...

    mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz

    这个版本支持GLIBC 2.12库,适用于64位处理器架构。 **MySQL 5.7.24 版本详解** MySQL 5.7是其主版本中的一个重要里程碑,引入了诸多性能提升、功能增强以及安全性改进。5.7.24作为该系列的一个稳定版本,主要包含...

    MySQL-client-5.5.48-1.linux2.6.i386.rpm、MySQL-server-5.5.48-1.linux2.6.i386.rpm

    1. **性能提升**:引入了更多性能优化,比如更快的查询处理,优化的内存管理,以及更好的并发控制,使得数据库在高负载下表现更佳。 2. **复制改进**:引入半同步复制,确保主库上的事务在被复制到从库之前已经提交...

    MySQL-Cluster架构图文详解

    ### MySQL-Cluster 架构详解 #### 一、配置环境 **操作系统**: Linux CentOS 5.0 **MySQL版本**: mysql-cluster-gpl-7.1.13-linux-i686-glibc23.tar.gz(需确保是Cluster版本,可从官网下载:...

    MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rar

    在这个特定的压缩包"MySQL-client-5.6.29-1.linux_glibc2.5.x86_64.rar"中,我们关注的是MySQL客户端的5.6.29版本,针对Linux操作系统,并且是为glibc 2.5编译的x86_64架构。这个版本的客户端包含了运行在64位Linux...

Global site tag (gtag.js) - Google Analytics