MVCC(多版本并发控制)
Innodb 提供了两个读取操作:锁定读 和 非锁定读(MVCC提供的快照读)
MVCC提供的快照读:依赖底层的 undo log回滚日志
事务日志:undo log回滚日志 redo log重做日志
ACID:ACD(事务日志)+ I(锁+MVCC)
undo log的主要作用:
- 事务发生错误时回滚 rollback
- 提供MVCC的非锁定读(快照读)
用链表实现,节点里面的 DB_ROLL_PTR
指向上一个历史记录。
已提交读:每一次select,都会产生一次新的数据快照(数据已经被事务正确commit提交过了)
为什么无法解决“不可重复读”?
因为每一次select都会重新产生一次数据快照,其它事务更新后而且已提交的数据,可以实时反馈到当前事务的select结果中。
为什么无法解决“幻读”?
因为每一次select都会重新产生一次数据快照,其它事务增加了和当前事务查询条件相同的新的数据并且以成功commit提交,导致当前事务再次以同样的条件查询时,数据多了。
可重复读:第一次select产生数据快照,而且只产生一次。
为什么解决了“不可重复读”?
第一次select产生数据快照,其它事务虽然修改了罪行的数据,但是当前事务select时,依然查看的是最初的快照数据
快照内容读取原则:
1、版本未提交无法读取生成快照
2、版本已提交,但是在快照创建后提交的,无法读取
3、版本已提交,但是在快照创建前提交的,可以读取
4、当前事务内自己的更新,可以读到