mysql的逻辑架构
一、mysql的逻辑分层
- 第一层:即最上层的服务不是mysql独有的,主要是基于客户端/服务端的工具,如连接处理、授权认证、安全等
- 第二层:架构有大多数mysql的核心服务,其中包括查询解析、分析、优化、缓存以及所有的内置函数(例如日期、时间、数学和加密函数),所有跨存储引擎功能的都在这层实现,比如存储过程、触发器、视图等。
- 第三层:包含了存储引擎。存储引擎负责mysql中的数据存储和提取。每个引擎都有自己的优势,服务器通过api与存储过程之间相互通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询结果透明。存储引擎包含几十个底层函数,用于执行诸如“开始一个事务”或者“根据主键提取一行记录”等操作。但是存储引擎不会解析sql(innoDB例外,会解析外键),不同的引擎之间也不会相互通信。而只是简单的响应上层服务器的请求。
二、innoDB的mvcc
2.1 mvcc是操作流程
- SELECT:innoDB会根据两个条件检查每行记录:
- innoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于当前系统版本号),这样可以确保数据读取的行,要么是在事务开始之前已经存在,要么是事务自身插入或者修改过的。
- 行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。
- INSERT:innoDB为新插入的每一行保存当前系统版本号作为行版本号。
- DELETE:innoDB为删除的每一行保存当前系统版本号作为行删除标识。
- UPDATE:innoDB为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识
注意:
事务不是在begin或start transaction时开启,而是在第一次执行语句是才正式开启。如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令。
2.2 mvcc如何解决幻读
mysql里面实际上有两种读,一种是“快照读”,一种是“当前读。
2.2.1 快照读
在快照读的情况下,mvcc通过(mvcc)的方式即可解决,mvcc通过事务版本号的方式控制。
使用select进行查询,就是快照读,具体例子如下:
2.2.2 当前读
对于会对数据修改的操作(update、insert、delete)都是采用当前读的模式,以及对数据进行加锁,如:
-- 加共享锁
select * from test where id = 1 lock in share mode;
-- 加排它锁
select * from test where id = 1 for update;