目录
1.MVCC基本概念
1.当前读:
2.快照读:
3.MVCC:Multi-Version Concurrency Control,多版本并发控制:
2.MVCC实现原理-三个隐藏字段
3.MVCC实现原理-undo log日志
1.undo log:回滚日志
2.undo log版本链
4.MVCC实现原理:readView
1.ReadView,读视图:
2.版本链数据访问规则
5.不同隔离级别下的readView
1.在RC,Read Committed下:
2.在RR,Repeatable Read下:
6.MVCC+锁:
1.MVCC基本概念
1.当前读:
读取的是记录的最新版本,读取时保证其他并发事务无法修改当前记录,会对读取的记录加锁
2.快照读:
读取的是记录的可见版本,可能是历史数据,不加锁,比如简单的select就是快照读
* 默认的隔离级别下:开启事务后第一个select语句就是快照读的地方,后续select时查询的就是快照数据
* 是非阻塞读的,因为都可以读到快照数据
3.MVCC:Multi-Version Concurrency Control,多版本并发控制:
指维护一个数据的多个版本,使得读写操作没有冲突
* 快照读就为MVCC提供了一个非阻塞读功能
* MVCC的实现原理:数据库中的三个隐式字段、undo log日志、readView
2.MVCC实现原理-三个隐藏字段
* 记录中的隐藏字段
* 两个或者三个(DB_ROW_ID是没有主键才会自动生成的)
3.MVCC实现原理-undo log日志
1.undo log:回滚日志
* 在insert、update、delete时产生的便于数据回滚的日志
* insert时,产生的undo log只在回滚时需要,事务提交后,可以立即删除
* update、delete时,产生的undo log日志不仅在回滚时需要,快照读时也需要,不会立即删除
2.undo log版本链
* 不同事务对同一条记录进行修改,会导致该记录的undo log生成一条记录版本链条,链条的头部是最新的旧记录,链条的尾部是最早的旧记录
4.MVCC实现原理:readView
1.ReadView,读视图:
是快照读SQL执行时MVCC提取数据的依据,记录并维护当前活跃(未提交)的事务ID
简单来说:快照读在读取时可以读取历史版本,而undo log日志形成的版本链产生了很多历史记录,readView是用来判断读取哪一个历史记录的
* readView包含四个核心字段:
2.版本链数据访问规则
* trx_id:当前事务id
5.不同隔离级别下的readView
1.在RC,Read Committed下:
事务中每一次执行快照读生成ReadView
2.在RR,Repeatable Read下:
仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView(同一个事务中读取两条相同数据是一样的,从而保证可重复读)
6.MVCC+锁:
保证了事务的隔离性和一致性