InnoDB 对 MVCC(多版本并发控制)的实现主要涉及以下三个关键组件:
-
隐藏字段(Hidden Fields):
InnoDB在每个数据行中引入了一些隐藏字段,其中包括DB_TRX_ID(最后一次修改行的事务 ID)和DB_ROLL_PTR(指向undo log的指针)等。这些字段用于标记每个数据行的版本信息。
-
Read View:
Read View是事务读取数据时的一个快照。每个事务都有自己的Read View。Read View包含了该事务启动时的系统版本号,用于确定该事务在哪个版本的数据行上建立了视图。Read View还包括了一组活跃的事务 ID,用于判断哪些事务的修改对该事务是不可见的。
-
Undo Log:
Undo log记录了每个事务所做的修改。当某个事务对一个数据行进行修改时,InnoDB将修改前的数据记录到undo log中。如果其他事务需要读取该数据行的旧版本,可以通过DB_ROLL_PTR找到undo log中相应的历史版本。
MVCC 的基本原理是,对于每个数据行,InnoDB 会保存它的多个版本,每个版本都有一个唯一的事务 ID。在读取数据时,事务只能看到在它启动时已经提交的事务所做的修改。这样可以提高并发性,允许事务之间彼此不受影响地读取和修改数据。