From MySQL High performance third edition:
We illustrate how MVCC works by InnoDB's streamlined behavior.
InnoDB's MVCC is achieved by saving two hidden columns after each row of records. These two columns, one saves the creation time of the row, and one saves the line's Expiration time (delete time). Of course, the storage is not the actual time value, but the system version number. Every start of a new thing, the system version number is automatically incremented. The system version number of the start of a thing is the version number of the thing that is used to compare the version number of the query to the row record. Let's take a look at the repeatable read isolation level, how MVCC is specifically operated.
SELECT
InnoDB will check each line of records based on 2 criteria:
A. InnoDB only finds data rows that have a version number earlier than the current system version (that is, the system version number of the line is less than or equal to the system version number of the Thing), which ensures that the line that the thing reads is either present before the thing starts, or the thing itself is inserted or modified.
B. The deleted version of the row is either undefined or larger than the current system version number. This ensures that the line that the thing reads to is not deleted before the thing starts.
INSERT
InnoDB saves the current system version number as the version number of the row for each newly inserted row.
DELETE
InnoDB saves the current system version number for each row deleted as a row delete identity.
UPDATE
InnoDB to insert a new record, save the current system version number as the line version number, while saving the current system version number as the original behavior line to delete the identity.
MVCC is really repeatable read and read commited two isolation levels work.
MySQL's InnoDB MVCC multi-version control