innodb数据多版本,回滚段,快照读

数据多版本

数据多版本是一种能够进一步提高并发的方法,它的核心原理是:

写任务发生时,将数据克隆一份,以版本号区分

写任务操作新克隆的数据,直至提交

并发读任务可以继续读取旧版本的数据,不至于阻塞

 

 

对应到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技术内幕>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值