• 已删除用户
Administrator
发布于 2021-05-06 / 385 阅读
0

MySQL的架构

MySQL的架构

一、MySQL逻辑框架

MySQL的逻辑框架主要分为三层:

第一层:连接/线程处理,大多数基于网络的客户端/服务器都有类似的框架;

第二层:查询/缓存,解析器,优化器,MySQL的核心功能都在这一层;

第三层:存储引擎,负责My’SQL中数据的存储和提取;

image-20210506102629265

二、并发控制

2.1读写锁

这两种类型的锁也被称为共享锁和排他锁。读锁是共享的,或者说是相互不堵塞的;写锁是排他的,会堵塞其他读锁和写锁。在MySQL中写锁有比读锁更高的优先级

2.2锁粒度

表锁是MySQL中最基本的锁策略,也是开锁最小的策略。在特定情况下,例如使用“ALTER TABLE”等语句,服务器会直接使用表锁;

行锁可以最大程度的支持并发操作,同时也带来了最大的锁开销;

三、事务

ACID:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)

隔离级别:READ UNCOMMITTED(未提交读),READ COMMITTED(提交读),REPEATABLE READ(可重复读),SERIALIZABLE(可串行读)

3.1死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶行循环的现象。

image-20210506104754511

如果两个事务都执行了第一个UPDATE数据,锁定了该行数据,当执行第二条语句时,就会发现对方锁定,导致死锁;

解决方案:持有最少行级排他锁的事务进行回滚;

3.2事务日志

Write-Ahead Logging原理:存储引擎修改数据时,只需要修改数据的内存拷贝,然后持久化到事务日志,不需要每次都将修改的数据本省持久化到磁盘;

原因:1、内存拷贝会出现数据丢失情况,通过事务日志持久化可以在重启恢复时,修复数据;2、事务日志是通过追加的方式,通过顺序I/O,而不是多个地方移动磁头,相对快很多;

3.3MySQL中的事务

3.3.1隐式锁定

自动提交:一条SQL就是单独的一个事务;另外也可以通过START TRANSACTION,COMMIT,ROLLBACK进行手动提交;

3.3.2显示锁定

MySQL支持LOCK TABLES和UNLOCK TABLES语句,这就是服务器实现的,和存储引擎无关。

四、多版本并发控制

MVCC原理:通过保存数据在某个时间点的快照实现。保证了每个事务看到的数据都是一致的。

Innodb的MVCC:通过在每行记录的后面保存两个隐藏列实现。一个列保存行的创建时间,一个列保存行的删除时间(实际为版本号而非时间)。每开启一个新事物,系统版本号会自动递增。

select:首先生成该查询操作的版本号a,并保证数据行的创建版本号<a<数据行的删除版本号或者没有;目的是,使得查询到的数据实在事务开始之前就已经被定义的,且未被删除的。

insert:在新插入数据行的创建版本号保存当前插入操作的版本号;

delete:在删除数据行的删除版本号保存当前删除操作的版本号;

update:插入一条新数据,原来行调加删除版本号,新行添加创建版本号;

理解:不可重复读,前后读取同一个数据时,因中间有其他操作,导致你读取数据不一致。通过MVCC读取数据时,假设数据版本号创建为1,删除为空,即(1,null),两次读取操作开启事务,版本号为2、3,update版本号为4,并发时,存在update执行顺序在两次读取之间,第一次读操作时,正常读取版本号为(1,null)数据行,执行update操作时,(1,null)修改为(1,4),同时创建新的数据行(4,null),当执行第二次update操作时,需满足(创建版本号<2<删除版本号),所以仍然会读取到(1,4)原数据,而不会读取(4,null)这个新数据,保证了可重复读。

tips:MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作,其他隔离级别不兼容。