MySQL的架构
一、MySQL逻辑框架
MySQL的逻辑框架主要分为三层:
第一层:连接/线程处理,大多数基于网络的客户端/服务器都有类似的框架;
第二层:查询/缓存,解析器,优化器,MySQL的核心功能都在这一层;
第三层:存储引擎,负责My’SQL中数据的存储和提取;
二、并发控制
2.1读写锁
这两种类型的锁也被称为共享锁和排他锁。读锁是共享的,或者说是相互不堵塞的;写锁是排他的,会堵塞其他读锁和写锁。在MySQL中写锁有比读锁更高的优先级;
2.2锁粒度
表锁是MySQL中最基本的锁策略,也是开锁最小的策略。在特定情况下,例如使用“ALTER TABLE”等语句,服务器会直接使用表锁;
行锁可以最大程度的支持并发操作,同时也带来了最大的锁开销;
三、事务
ACID:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)
隔离级别:READ UNCOMMITTED(未提交读),READ COMMITTED(提交读),REPEATABLE READ(可重复读),SERIALIZABLE(可串行读)
3.1死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶行循环的现象。
如果两个事务都执行了第一个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两个隔离级别下工作,其他隔离级别不兼容。