当MySql隔离级别是REPEATABLE READ,READ COMMITED时。 通过MVCC多版本并发控制。保证读不加锁,读写不冲突。
MVCC的实现
为了实现MVCC,innodb对每一行都加上两个隐含的列,其中一列存储行被更新的时间,另外一列存储行被删除的时间。但是innodb存储的并不是绝对的时间,而是与时间对应的数据库系统的版本号。(保存这两个额外系统版本号使大多数读操作可以不加锁)
每当一个事务开始的时候,innodb都会给这个事务分配一个递增的版本号。所以版本号也可以被认为是事务号。
- 对于每一个查询语句,innodb都会把这个查询语句的版本号同查询遇到的行的版本号进行对比,然后结合不同的事务等级来决定是否返回该行。
select语句实现
Innodb只查找版本号早于当前事务版本的数据号(包括等于)。这样可以确保事务读取的行要么是事务开始前已经存在的,要么是事务自身插入或修改的。
行的删除版本号,要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行在事务开始之前未被删除。
insert语句实现
Innodb为新插入的每一行保存当前系统版本号作为行版本号。
update语句实现
Innodb为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号为原来的行的删除标识。