MySql --MVCC实现原理(乐观锁实现原理)

当MySql隔离级别是REPEATABLE READ,READ COMMITED时。 通过MVCC多版本并发控制。保证读不加锁,读写不冲突。

MVCC的实现

  1. 为了实现MVCC,innodb对每一行都加上两个隐含的列,其中一列存储行被更新的时间,另外一列存储行被删除的时间。但是innodb存储的并不是绝对的时间,而是与时间对应的数据库系统的版本号。(保存这两个额外系统版本号使大多数读操作可以不加锁)

  2. 每当一个事务开始的时候,innodb都会给这个事务分配一个递增的版本号。所以版本号也可以被认为是事务号。

  3. 对于每一个查询语句,innodb都会把这个查询语句的版本号同查询遇到的行的版本号进行对比,然后结合不同的事务等级来决定是否返回该行。

select语句实现

Innodb只查找版本号早于当前事务版本的数据号(包括等于)。这样可以确保事务读取的行要么是事务开始前已经存在的,要么是事务自身插入或修改的。

行的删除版本号,要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行在事务开始之前未被删除。

insert语句实现

Innodb为新插入的每一行保存当前系统版本号作为行版本号。

update语句实现

Innodb为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号为原来的行的删除标识。

展开阅读全文

没有更多推荐了,返回首页