Mysql的并发控制原理( 二 )


每次开启一个事务 , 系统版本号都会递增 。事务开始时 , 系统版本号会作为事务的版本号 , 用来和查询到的行的版本号进行比较 。下面分别介绍常见的CRUD操作中版本号是怎么工作的:
INSERT
保存当前系统版本号作为行版本号
DELETE
保存当前的系统版本号到这行数据的“删除版本” 。
UPDATE
插入一行新纪录 , 保存当前系统版本号作为行版本号 , 同时保存当前系统版本号到原来的行的“删除版本” 。
SELECT

  • 只查找版本早于当前事务版本的行 。这样可以保证事务读取都的行 , 要么之前就存在 , 要么是这个事务本身自己插入或者修改的 。
  • 行的“删除版本”要么未定义 , 要么大于当前事务版本号 。这样可以确保事务读取到的行 , 在事务之前没有被删除 。
MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作 , 其它两个隔离级别不能工作 。因为READ UNCOMMITTED总是读取最新的数据防 , 而不是符合当前事务版本的数据行 。而SERIALIZABLE则会对所有读取的行都加锁 。




推荐阅读