mvcc的实现原理主要由三个隐藏字段、undolog和read view实现。
隐藏字段:
DB_TRX_ID:事务ID,创建时的事务或者最后修改记录的事务ID
DB_ROLL_PTR:回滚指针,指向上个版本,配合undolog用于回滚
DB_ROW_ID:行号,如果没有主键,innodb自动生成的隐藏主键
undo log日志:
回滚日志,记录历史版本数据
read view:
指某个事务在进行第一次数据读取时,会读取当前最新的数据,也就是说读取操作之前其他事务最后一次修改后的数据
RC和RR的不同在于生成read view的策略不同。
RC只会在事务第一次读取的时候生成read view,之后一直使用这个read view,所以保证了这个事务中读取的数据一直一致。
RR读取的时候则是每次都重新生成read view,所以会产生不可重复读的情况,因为每次读都是最新的数据。
ACID如何保证:
A(原子性):依靠undo log回滚日志保证原子性,要么全部失败要么全部成功
C(一致性):靠其他三个以及业务上的处理共同保证
I(隔离性):依靠MVCC保证了隔离性
D(持久性):依靠redo log日志保证了持久性,有数据修改、增加和删除会先记录到redo log日志用,如果最后入库失败也能通过redo log日志恢复