innoDB介绍
1.逻辑存储结构
表–》段–》区–》页–》行
2.架构
2.1内存结构
2.1.1 缓冲区(Change Pool)
2.1.2 changeBuffer(更改缓冲区)
主要是针对二级索引:减少io操作
2.1.3 自适应hsah索引(Adaptive Hash Index)
优化缓冲区数据查询
2.2.4日志缓冲区
保存写入磁盘中的log日志数据
2.2 磁盘结构
2.3 后台线程
3.事务原理
- 事务:一组操作的集合,是一个不可分割的工作单位,它是一起成功或者一起失败
- 特性(ACID):
- 原子性:不可分割最小单位,同生死
- 一致性: 事务完成时,必须所有数据保持一致状态
- 隔离性:数据库系统提供隔离机制,保证事务不在外部并发操作性影响下独立环境运行
- 持久性:事务一旦提交或者回滚,他对数据的改变就是永久的
3.1 如何实现呢?
3.1.1持久性:redo log(重做日志)
主要是发生内存刷新到磁盘发生错误
3.1.2 原子性:undo log(回滚日志)
记录数据被修改前的信息
作用:回滚和MVCC(多版本并发控制)
3.1.3 隔离性和一致性
4.MVCC
- 当前读: 读取最新版本,对读取记录加锁,保证其他并发事务不能修改当前记录。共享锁、排他锁
- 快照读:(就是select不加锁)读取记录数据的可见版本(有可能是历史数据),不加锁,非阻塞读。
- 读已提交:每次select,都生成一个快照读
- 可重复读:开启事务后第一个selcte语句
- 序列化:快照度退化为当前读
4.1介绍
Muti-version Concurrency Control 多版本并发控制:维护一个数据多个版本,使得读写操作没有冲突,快照读为Mysal实现MVCC提供了一个非阻塞功能。
4.2实现依赖
4.2.1三个隐式字段
4.2.2 undo log
回滚日志,在insert、update、delete时数据回滚
insert时产生的日志只在回滚是需要,事务提交后可以被立即删除。但update和delete不仅回滚需要,快照读时也需要,不会被立即删除。
生成版本链
4.2.3 readView
读视图是快照读SQL执行MVCC提取数据依据,记录并维护当前活跃的事务(未提交)的id
核心字段
4.3MVCC实现原理
readView 详解
trx_id:当前事务id
但它生成时机因隔离级别不同而不同
读已提交:事务每一次执行快照读时产生
过程解析(第一次):
可重复读:仅在第一次事务执行快照读时生成,后续复用它。
过程解析:两个版本都一样,结果也一样