MySQL架构
数据库
2018-05-04 18:23:24
阅读次数: 2
MySQL架构
- MySQL逻辑架构
- 逻辑架构图
- 第一层:连接处理、授权认证、安全等等
- 第二层:核心服务功能如查询解析、分析、优化、缓存、所有的内置函数(日期、时间、数学、加密函数等),所有跨存储引擎功能:存储过程、触发器、视图等
- 第三层:存储引擎。mysql数据的存储和提取
- 并发控制
- 读写锁
- 共享锁(读锁):相互不阻塞
- 排它锁(写锁):写锁阻塞其他的写锁和读锁
- 锁粒度
- 表锁:开销最小,锁定整张表
- 行级锁:最大程度地支持并发处理,也带来了最大的锁开销
- 事务
- 四大特性(ACID)
- 原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚
- 一致性(consistency)
数据库总是从一个一致性的状态转换到另外一个一致性的状态
- 隔离性(isolation)
一个事务所做的修改在最终提交以前,对其他事务是不可见的
- 持久性(durability)
一旦事务提交,则其所做的修改就会永久保存到数据库中
- 四种隔离级别
- 未提交读(READ UNCOMMITTED)
事务可以读取未提交的数据,也被称为脏读
- 提交读(READ COMMITTED)
只能“看到”已提交的事务所做的修改,符合隔离性,也叫做不可重复读(两次执行同样的查询,可能会得到不一样的结果)
- 可重复读(REPEATABLE READ) mysql默认事务隔离级别
在同一个事务中多次读取同样记录的结果是一致的,解决了脏读,存在幻读
幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。
InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读问题
- 可串行化(SERIALIZABLE)
最高隔离级别,强制事务串行执行,读取的每一行数据上都加锁
- 总结
- 死锁
- 两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环现象
- 多个事务以不同的顺序锁定资源或者同时锁定同一个资源时,可能会产生死锁
- 解决
- 提供死锁检测和死锁超时机制
- InnoDB存储引擎处理死锁的方法:将持有最少行级排他锁的事务进行回滚
- MySQL中的事务
- 多版本并发控制
- 非阻塞读操作,写操作也只锁定必要的行,开销更低,行级锁的变种
- 通过保存数据在某个时间点的快照来实现的
- 乐观并发控制和悲观并发控制
- InnoDB的MVCC
- 在每行记录后面保存两个隐藏的列,一个保存行的创建时间,一个保存行的过期时间(或删除时间),存储的并不是实际的时间值,而是系统版本号。没开始一个新的事务,系统版本号都会自动递增
- SELECT
- 查找版本早于当前事务版本的数据行
- 行的删除版本要么未定义,要么大于当前事务版本号
- INSERT
为新插入的每一行保存当前系统版本号作为行版本号
- DELETE
为删除的每一行保存当前系统版本号作为行删除标识
- UPDATE
为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识
- MVCC只在 可重复读 和 提交读 两个隔离级别下工作
- MySQL的存储引擎
待更...
转载自my.oschina.net/u/3163032/blog/1806999