千家信息网

掌握mysql的底层原理之并发控制

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,本文主要给大家介绍mysql的底层原理之并发控制,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql的底层原理之并发控制吧。1、mysql
千家信息网最后更新 2024年11月26日掌握mysql的底层原理之并发控制

文主要给大家介绍mysql的底层原理之并发控制,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql的底层原理之并发控制吧。

1、mysql的逻辑框架

mysql逻辑框架图如下:

最上层是处理客户端过来的连接的

主要做连接处理、授权认证、安全等。Mysql在这一层维护了一个线程池,用于处理来自客户端的连接。Mysql可以使用用户名密码认证,

也可以使用SSL基于X.509证书认证。

第二层由三部分组成:查询缓存、解析器、优化器。解析器用来解析SQL语句,优化器会对解析之后的语句进行优化。

在解析查询前,云服务器会先检查查询缓存,如果能在其中找到对应的查询结果,则无需再进行查询解析、优化等过程,直接返回查询结果。存储过程、触发器、视图等都在这一层实现。

第三层是存储引擎,存储引擎负责在MySQL中存储数据、提取数据、开启一个事务等等。存储引擎通过API与上层进行通信,这些API屏蔽了不同存储引擎之间的差异,使得这些差异对上层查询过程透明。存储引擎不会去解析SQL。mysql最常用的存储引擎是InnoDB。

2、mysql的并发控制

如果多个线程同时操作数据,就有可能引发并发控制的问题。

2-1、读写锁

如果多个线程都只是读数据,其实可以一起读,不会互相影响,这个时候应该使用"读锁",也称为共享锁。

获取读锁的线程之间互相不会阻塞,可以同时读取一个资源。

如果有一个线程需要写数据,则应该使用"写锁",也成为排它锁。

写锁会阻塞其它的写锁和读锁,直至写操作完成。

2-2、锁粒度

首先明确一个概念:在给定的资源上,需要加锁的数据越少,系统能够承载的并发量就越高。

但加锁也是需要消耗资源的,如果系统花费大量的时间来管理锁,而不是存取数据,

那么系统的性能可能会因此受影响。

所以一个好的"锁策略"就是要在锁的开销和数据的安全性之间寻求平衡,Mysql支持多个存储引擎的架构,

每种存储引擎都可以实现自己的锁策略和锁粒度。

2-3、表锁和行锁

表锁顾名思义就是锁住整张表。表锁开销比较小。对表加写锁后,其它用户对这张表的所有读写操作都会被阻塞。

在Mysql中,尽管存储引擎可以提供自己的锁,但Mysql有时候也会使用表锁,比如ALTER TABLE之类的语句。

写锁比读锁有更高的优先级,因此一个写锁请求可能会插入到读锁队列的前面。

行级锁即锁住整行,可以最大程度地支持并发处理,但加解锁的开销也会比较大。行级锁只在储存引擎层实现,

所有的存储引擎都以自己的方式实现了行级锁。

3、MVCC

MVCC即"多版本并发控制",可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,

因此开销更低。

主流的关系型数据库都实现了MVCC,但实现机制各有不同。实际上MVCC也没有一个统一的标准。

但大都实现了非阻塞的读操作,写操作也只是锁定必要的行。

MVCC保证的是每个事务里面在执行期间看到的数据都是一致的。

但不同的事务由于开始的时间不同,所以可能对同一张表,同一时刻看到的数据是不一样的。

在Mysql的InnoDB引擎,是通过给每行记录后面保存两个隐藏的列来实现的。

一个是保存行的创建时间,另一个保存了行的过期时间(或删除时间)。

实际上存储的并不是实际的一个时间戳,而是'系统版本号'。

每次开启一个事务,系统版本号都会递增。事务开始时,系统版本号会作为事务的版本号,用来和查询到的行的版本号进行比较。

下面分别介绍常见的CRUD操作中版本号是怎么工作的:

INSERT

保存当前系统版本好的作为行版本号

DELETE

保存当前的系统版本号到这行数据的"删除版本"。

UPDATE

插入一行新纪录,保存当前系统版本号作为航版本号,同时保存当前系统版本号到原来的行的"删除版本"。

SELECT

只查找版本早于当前事务版本的行。这样可以保证事务读取的行,要么之前就存在,

要么是这个事务本身自己插入或者修改的。

行的"删除版本"要么未定义,要么大于当前事务版本号。这样可以确保事务读取到的行,

在事务之前没有被删除。

MVCC只在REPEATABLE READREAD COMMITTED两个隔离级别下工作,其它两个隔离级别不能工作。

因为READ UNCOMMITTED总是读取最新的数据防,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁。

看完以上关于mysql的底层原理之并发控制,很多读者朋友肯定多少有一定的了解,如需获取更多的行业知识信息 ,可以持续关注我们的行业资讯栏目的。

版本 数据 事务 存储 引擎 系统 查询 控制 时间 线程 不同 开销 要么 处理 阻塞 原理 底层 上层 两个 之间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 金铲铲微信区服务器 王者荣耀转服务器需要等多久 云服务器53端口打开会被攻击吗 专家发布网络安全宣传 微信服务器登陆ip 数据库原理及应用教程习题 如何保护网络安全隐患 通美网络技术服务有限责任公司 戴尔r620服务器显卡设置 数据库自动化学报怎么看 互联网金融科技委员会成员 即墨区管理软件开发哪家靠谱 服务器pcie扩展卡 无限极数据库营销 杉果怎么显示服务器错误 华为云数据库创新技巧 网吧的网线是服务器还是什么 软件开发工程师英文怎么说 四川企业党建软件开发电话 网络安全与执法学习资料哪个好 网络安全行业竞技 软件开发人员结构化面试 学校多个年级数据库 关于网络安全的简介作文 开一个电脑服务器需要什么 穿越火线怎么进不了战队服务器 数据库技术及应用基础教程书籍 十大金融软件开发商 服务器运维管理报告 联想与华三服务器哪个好
0