第一章 MYSQL架构

1.1 MYSQL逻辑架构

第一章 MYSQL架构

第一层:并非MYSQL独有,许多都是基于网络的客户端/服务器模型,建立链接;

第二层:MYSQL的大部分核心内容,比如查询、分析、优化、缓存及所有的内建函数; 

第三层:数据库存的存储引擎。

1.1.1 连接管理和安全性

1.1.2 优化和执行

1.2 并发控制

1.2.1读锁和写锁

1.2.2锁粒度

表锁和行级锁

1.3 事务

什么是事务:是指一系列操作要么全部执行,要么全部不执行,即满足原子性操作。

其中ACID是事务中的重要概念。

在介绍ACID之前,先举个简单的例子:银行应用中,假设一个银行数据库有两张表,checking和saving表。现在要从jane的支票账户里转账200美元到她的存款账户,那么至少需要三步:

1. 检查支票存款账户的余额是否大于200;

2. 从支票存款账户余额中减去200;

3. 在存款余额中增加200;

那么很简单,这三个步骤,如果只有其中一个执行了,那么将会出现钱不符合逻辑的情况发生,即一定要满足事务性,即要么全部执行,要么全部不执行。

下面来介绍事务中的ACID:

原子性:一个事务必须被视为一个单独的内部的不可分的工作单元,以确保整个事务要么全部执行,要么全部回滚;

隔离性:某个事务的结果只有在完成之后才对其他的事务可见。

一致性:即所以的操作完成需要满足一致性,不会影响数据的一致性,即数据库总是从一种状态转换到另一种一致性的状态

持久性:一旦一个事务提交,事务所做的数据改变将是永久的。

1.3.1 隔离级别

隔离的问题比我们想象的还要复杂,SQL下定义了四个隔离级别,用来限定事务内外的哪些改变是可见,哪些是不可见的。

简单介绍下四种隔离:

READ UNCOMMITED(读取未提交内容):所有的事务都可以看到未提交事务的执行结果,会出现脏读的情况,即事务还没有提交,就被读取了。

READ COMMITED (读取提交内容):一个事务开始时,只能看见提交提交的事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别他也支持所谓的不可重复读,即用户运行同一个语句两次,查询的结果可能是不同的。

REPEATABLE READ(可重读):确保同一个事务的多个实例在并发读取数据时,会看到相同的数据行。不过会出现幻读的情况,即用户读取某一个范围的数据时,另一个事务又在该范围内插入了新行,当用户再次读取的时候就会出现幻读。在InnoDB的存储引擎中通过MVCC(多版本控制)机制解决了幻读的问题;

SERIALIZABLE(可串行化):是高级版的隔离级,他通过强制事务排序,使之不可能相互冲突,从而解决幻读的情况。简而言之就是在每行上加锁。

 1.3.2 死锁

1.4多版本并发控制

MVCC 通过及时的保存某些时刻的数据快照,从而得以实现。各自引擎实现实现MVCC的方式是不同的,列如乐观并发控制,悲观并发控制。举例简单的说明下:

InnoDb通过给每个数据行增加两个隐含值的方式实现MVCC,这两个隐含值记录了行的创建时间,以及它的过期时间,每一行都存储了事件发生时的系统版本号,用来替代事件发生时的实际时间。每次开启一个新事物的时候,版本号会自动增加。每个事物都会保存它在开始时的当前系统版本的记录,而每个查询都会根据事物的版本号,检查每行数据的版本号。如:

SELECT :InnoDb 检查每行数据,确保他们符合两个标准:

innodb只查找版本早于当前事物版本的数据行(也就是数据行的版本必须小于等于事物的版本),这确保了当前事务读取的行都是在事务开始前已经存在的,或者是当前事物创建和修改的行。

数据行的删除版本必须是未定义的,或者是大于事务版本的,这保证了事务读取的行,在事务开始之前是未被删除的;

只有满足上述两项测试的数据行,才会被当做查询结果返回。

INSERT:Innodb为每个新增行记录了当前系统版本号;

MVCC 只工作在REPEATABLE READ 和READ COMMITED 两个隔离级别上。其他的都不兼容;

加锁策略 并发 系统开销 引擎
表级加锁 最低 最低 MYISAM
行级加锁 NDB cluster
支持MVCC的行级加锁 最高 最高 InnoDB