日期:2014-05-16  浏览次数:20737 次

Mysql 的 MVCC 实现原理

mysql 中mvcc 实现原理,可翻看源码查看

1个6BYTE的 DB_TRX_ID标识 该行insert或者update操作的最新事务ID,删除操作也被当作一个update操
作(用1个bit表示删除)

1个7BYTE的DB_ROLL_PTR,指向写到rollback segment的一条undo log记录(update操作的话,记录
update前的ROW值)

1个6BYTE的DB_ROW_ID,该值随新行插入单调增加,当由innodb自动产生聚集索引时,聚集索引包括这个DB_ROW_ID的值,不然的话聚集索引中不包括这个值

那么这个DB_TRX_ID是实现MVCC策略的关键

在REPEATABLE READ事务隔离策略下(INNODB 默认)

假设 A事务 先于 B事务

在A中select 该行    ,在B中update该行,那么在B的update先于A的select的情况下

B: 创建 该行的拷贝,设置拷贝的DB_TRX_ID为当前事务,设置原行的DELETE标志,并设置DB_TRX_ID为当前事务

A: 检查该行的DB_TRX_ID ,发现这个值大于A的trx_id,放弃该行,然后检查该行拷贝的DB_TRX_ID和DELETE标志,发现该行在事务开始前没有被删除,于是使用该行的拷贝,也就是原来的值

那么也就实现了不同事务在同一时间看到同一行的不同数据