MySQL InnoDB MVCC

MVCC-基本概念

  • 当前读

读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如: select ... lock in share mode(共享锁)select ... for update, update, insert,delete(排他锁)都是一种当前读。

  • 快照读

简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。

Read Committed:每次select,都生成一个快照读。

Repeatable Read:开启事务后第一个select语句才是快照读的地方。

Serializable:快照读会退化为当前读。

MVCC

全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo log日志、readView

MVCC-实现原理

记录中的隐藏字段

 

undo log

回滚日志,在insertupdatedelete的时候产生的便于数据回滚的日志。

insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。

updatedelete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。

 

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

ReadView

ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id

ReadView中包含了四个核心字段:

  

不同的隔离级别,生成ReadView的时机不同:

READ COMMITTED在事务中每一次执行快照读时生成ReadView.

REPEATABLE READ仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView

RC隔离级别下,在事务中每一次执行快照读时生成ReadView.

 

 

RR隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView.

 

 

posted @   熊掌和鱼  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示