众所周知MySQL中InnoDB的可重复读是通过MVCC实现的。
MVCC是由哪些元素构成?
MVCC的读 又叫快照读,在MySQL中不可能把整个表的数据拷贝一份来提供这个快照。它通过
1、undolog
InnoDB增删数据时除了redo log外还会记录undo log。
以update举例: undolog->修改内存中数据页->redolog prepare->binlog-> commit; 修改数据时 undo log记录原始数据。用于以后或许会发生的回滚操作。
2、表中的的隐藏列 data_trx_id,data_roll_pt
一张表中有三个隐藏列
rows_id: MySQL给予行的一个标识。如果表中没有主键,那么就会使用row_id来组织数据。
data_trx_id: 事务id,创建一个新的事务,会分配一个自增的全局唯一的data_trx_id。
需要说明的是:begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。
data_roll_pt: 回滚指针,这个指针指向undo log中的一行记录原始记录。
3、Read View数组
创建事务时,InnoDB为事务创建了一个Read View的数组用来记录创建事务时刻的当前活跃事务data_trx_id。