数据多版本
数据多版本是一种能够进一步提高并发的方法,它的核心原理是:
写任务发生时,将数据克隆一份,以版本号区分
写任务操作新克隆的数据,直至提交
并发读任务可以继续读取旧版本的数据,不至于阻塞
对应到innodb上,具体是怎么做的呢
redo 日志
数据库事务提交后,必须将更新后的数据刷到磁盘上,以保证ACID特性。磁盘随机写性能较低,如果每次都刷盘,会极大影响数据库的吞吐量
优化方式是,将修改行为先写到redo日志里,再定期将数据刷到磁盘上,这样能极大提高性能
假如某一时刻,数据库崩溃,还没来得及刷盘的数据,在数据库重启后,会重做redo日志里的内容,以保证已提交事务对数据产生的影响都刷到磁盘上
undo日志
数据库事务未提交时,会将事务修改数据的镜像(即修改前的旧版本)存放在undo日志里,当事务回滚时,或者数据库崩溃时,可以利用undo日志,即旧版本数据,撤销未提交事务对数据库产生的影响
对于insert操作,undo日志记录新数据的PK,回滚时直接删除
对于delete/update操作,undo日志记录旧数据row,回滚时直接回复
回滚段
存储undo日志的地方,时回滚段
什么样的select时快照读
除非显示加锁,普通的select 语句都是快照读
例如 select* from t where id>2
这里的显示加锁,非快照读时指
select * from t where id>2 lock in sharc modc;
select * from t where id>2 for updatc
在RC 事务隔离级别下,对于快照数据,非一致性读总是读取被锁定行的最新一份快照数据 。在RR 事务隔离级别下,,对于快照数据,非一致性读总是读取事务开始时的行数据版本。
具体请参考大神的文章 InnoDB,快照读,在RR和RC下有何差异? https://mp.weixin.qq.com/s/gjt9WdyTQRzx-hr_qIz_mw
参考资料
https://mp.weixin.qq.com/s/R3yuitWpHHGWxsUcE0qIRQ
<MYSQL技术内幕>