mysql并发控制原理知识点

Mysql是主流的开源关系型数据库,提供高性能的数据存储服务。在做后端开发时,有时会遇到性能瓶颈,这些瓶颈有时并不是来自应用本身,而是来自数据库层面。

所以所以掌握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 READ和READ COMMITTED两个隔离级别下工作,其它两个隔离级别不能工作。

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

以上就是mysql的并发控制原理的详细内容,如果大家有任何补充可以联系我们小编。

(0)

相关推荐

  • MySQL中大对象的多版本并发控制详解

    MySQL 8.0:InnoDB中大对象的MVCC 在本文中,我将解释MySQL InnoDB存储引擎中大对象(LOB)设计的多版本并发控制(MVCC) . MySQL 8.0有一个新功能,允许用户部分更新大型对象,包括JSON文档 . 使用此部分更新功能,当LOB部分更新时,MVCC对LOB的工作方式已发生变化. 对于正常更新(完整更新),MVCC将像以前的版本一样工作. 让我们看一下MVCC在不涉及部分更新时的工作原理,然后考虑对LOB进行部分更新的用例. MVCC 常规更新 我使用术语常规

  • mysql多版本并发控制MVCC的实现

    事务隔离级别设置 set global transaction isolation level read committed; //全局的 set session transaction isolation level read committed; //当前会话 修改事务提交方式(是否自动提交,mysql默认自动提交) SET AUTOCOMMIT = 1; //自动提交,为0手动提交 不同数据库引擎MVCC模式各不相同,典型有乐观和悲观并发控制. innodb 说明: InnoDB的MVCC

  • mysql并发控制原理知识点

    Mysql是主流的开源关系型数据库,提供高性能的数据存储服务.在做后端开发时,有时会遇到性能瓶颈,这些瓶颈有时并不是来自应用本身,而是来自数据库层面. 所以所以掌握Mysql的一些底层原理有助于我们更好地理解Mysql,对Mysql进行性能调优, 从而开发高性能的后端服务. 1.mysql的逻辑框架 mysql逻辑框架图如下: 最上层是处理客户端过来的连接的. 主要做连接处理.授权认证.安全等.Mysql在这一层维护了一个线程池,用于处理来自客户端的连接.Mysql可以使用用户名密码认证, 也可

  • mysql数据库基础知识点与操作小结

    本文实例讲述了mysql数据库基础知识点与操作.分享给大家供大家参考,具体如下: 数据库 一. 修改数据表 添加一列: ALTERTABLE tab_name ADD col_name column_defi[FIRST|AFTER col_name]; 可以指定新列的位置关系,位于最开头(FIRST)或者位于某列之后(AFTER-),否则新列默认位于最后. 添加多列: ALTERTABLE tab_name ADD(col_name1 column_defi1,col_name2 column

  • MySql数据库基础知识点总结

    本文实例讲述了MySql数据库基础知识点.分享给大家供大家参考,具体如下: 数据库基本操作 1)创建数据库 基本语法: create database 数据库名称 : 创建应该名称为itcast的数据库.sql语法如下: ``create database ` itcast `:`` 需要主要的是,为了避免用户自定义的名称与系统命令冲突,最好使用反引号(``)包括数据库名称/字段名称和数据表名称 如果创建数据库存在,则程序会报错,为了防止此情况发生,再创建数据库可以使用"if not exist

  • MySQL查询优化必备知识点总结

    前言 查询优化本就不是一蹴而就的,需要学会使用对应的工具.借鉴别人的经验来对SQL进行优化,并且提升自己. 先来巩固一下索引的优点,检索数据快.查询稳定.存储具有顺序性避免服务器建立临时表.将随机的I/O变为有序的I/O. 但索引一旦创建的不规范就会造成以下问题,占用额外空间,浪费内存,降低数据的增.删.改性能. 所以只有在理解索引数据结构的基础上才能创建出高效的索引. **本文所有操作均在MySQL8.0.12** 一.创建索引规范 在学习索引优化之前,需要对创建索引的规范有一定的了解,此规范

  • MySQL锁的知识点总结

    锁的概念 ①.锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具. ②.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制. ③.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源. ④.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题. ⑤.锁的冲突也是影响数据库并发访问性能的一个重要因素. MySQL锁的概述 相对于其它数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的

  • 深入mysql并发插入优化详解

    使用storm处理日志的时候,经常会遇到并发插入mysql的效率问题,到网上查了些资料,做一下笔记将表的引擎改为 myisam, 修改 my.cnf 的concurrent_insert=2,concurrent_insert 可以设的值有 0 1 2 ,2 是完全支持并发插入 1) concurrent _insert =0 ,无论MyISAM的表数据文件中间是否存在因为删除而留下俄空闲空间,都不允许concurrent insert. 2)concurrent_insert = 1,是当My

  • MySQL并发更新数据时的处理方法

    UPDATE是否会加锁? SQL语句为如下时,是否会加锁? UPDATE table1 SET num = num + 1 WHERE id=1; 答案是不会 实际上MySQL是支持给数据行加锁(InnoDB)的,并且在UPDATE/DELETE等操作时确实会自动加上排它锁.只是并非只要有UPDATE关键字就会全程加锁,针对上面的MySQL语句而言,其实并不只是一条UPDATE语句,而应该类似于两条SQL语句(伪代码): a = SELECT * FROM table1 WHERE id=1;

  • MYSQL的主从复制知识点整理

    当单台MYSQL服务器无法满足当前网站流量时的优化方案.需要搭建mysql集群技术. 一.功能: 当向主服务器插入|修改|删除数据时,数据会自动同步到从服务器. 注意:主从复制是单向的,只能主 -> 从 分为两种类型:发射型(一主多从):一般使用在:备份.读写分离. 环形(多主多从):一般使用:当主服务器压力大时.跨地区的网站实现数据同步 在环形结构中,如果同时向三台服务器的同一表插入记录会出现"ID冲突的问题". 解决办法:让三台服务器生成不同的ID: 第一台:1,4,7...

  • MySQL架构体系知识点总结

    一  数据库和数据库实例 在MySQL的学习研究中,存在两个非常容易混淆的概念,即数据库和数据库实例.在MySQL中,数据库和数据库实例定义如下: 数据库:存储数据的集合: 数据库实例:操作数据库的集合. 如上定义很清楚了,数据库是用来存储数据的,数据库实例是用来操作数据的,从操作系统的角度,数据库实例表现为一个进程,对应多个线程, 在非集群数据库架构中,数据库与数据库实例存在一 一对应关系,在数据库集群中,可能存在多个数据库实例操作一个数据库情况,即多对一关系. 二  MySQL基架 对于My

  • MySQL ALTER命令知识点汇总

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 1.先创建一张表,表名为:testalter_tbl. 2.删除,添加或修改表字段 如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段: 3.如果数据表中只剩余一个字段则无法使用DROP来删除字段. MySQL 中使用 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型: 4.执行以上命令后,i 字段会自动添加到数据表字段的末尾

随机推荐