“MVCC,即多版本并发控制。顾名思义,MVCC就是通过对数据做多版本管理,来做到读不加锁,读写不冲突,进而提高数据库并发性能。在Innodb存储引擎中MVCC用来实现RR和RC两种事物隔离级别,即保证在这两种隔离级别下进行读操作时,读到的总是我们想要的数据。 ”
如下图所示,插入一条id为1,name为大西瓜的记录
此时我在上面提到的预设行,实际上会是下图这种格式,roll_pointer为null是因为INSERT操作的记录没有更早的版本,即不存在该属性,但是为了大家理解方便,这里表示为null:
“回滚日志,版本快照是保存在Undo日志中的,版本快照之间又是通过回滚指针roll_pointer链接起来的,这样就生成了版本链。 ”
假设存在两个id为100、200的事务对预设字段进行了更新操作,操作流程为:
trx_id=100 | try_id=100 |
---|---|
Begin | |
Begin | |
update user set name = "小西瓜" where id = 1; | |
update user set name = "西瓜籽" where id = 1; | |
Commit | |
update user set name = "大冬瓜" where id = 1; | |
upda te user set name = "小冬瓜" where id = 1; | |
Commit |
则其对应生成的版本链应当为:
MVCC之所以可以做到版本并发控制,很大程度上是依托于ReadView。我们前面提到过MVCC是用来实现RR和RC两种事务隔离级别的,当然在这两种隔离级别下的ReadView生成策略也是不同的: