MVCC (Multi-Version Concurrency Control) 是MySQL中用于解决幻读问题的一种机制。它通过保存数据在某个时间点的快照来实现。在快照读的隔离级别下,即使最新的数据在被读取时改变,也不会影响读取到的数据。
MVCC通过保存每行数据的旧版本来工作,这些旧版本在更新或删除数据时保留,并在读取时使用。这意味着,即使有新的提交,快照读也只能看到在读取开始时就已经提交的数据版本。
具体到MySQL InnoDB引擎,MVCC通过为每行数据添加两个隐藏的列(DB\_TRX\_ID,DB\_ROLL\_PTR)和一个指针(DB\_ROW\_ID)来工作:
DB_TRX_ID
:每次对某条数据进行改动时,都会给该改动赋予一个唯一的事务ID。DB_ROLL_PTR
:指向回滚段的指针,用于Undo信息。DB_ROW_ID
:当没有定义主键时,InnoDB会使用这个隐藏的列作为行的唯一标识。
快照读不会锁定表,而是通过读取行的一个快照来避免幻读。
例如,SELECT语句在READ COMMITTED隔离级别下通过以下方式使用MVCC:
SELECT * FROM table WHERE ... /* 快照读, 不会看到其他事务还未提交的更改 */
对于INSERT和DELETE操作,InnoDB会为它们设置新的一致性视图,确保它们看到的数据是在这个视图创建时的数据。
对于UPDATE和DELETE操作,InnoDB会为这些行创建一个新的版本,并在新的版本中更新或删除数据,同时旧的数据版本仍然可以供快照读读取。这样就避免了幻读问题。