Innodb MVCC工作原理
《MySQL》高性能的说法: 为何需要MVCC 对于事务型的存储引擎实现,仅仅依赖锁是不够的,还需要MVCC( Multiversion Concurrency Control )的帮助,可以简单的将MVCC理解成为一个row lock的一个变种,只是在必要的时候加行锁。 InnoDB的MVCC实现方式 每个事物存储引擎的MVCC实现方式是不一样的,InnoDB的MVCC简单来讲是通过给表添加两列隐藏列。 一列(创建列)存储行的insert(如果行不存在)时间或者update(如果行已存在)时间,一列存储行的删除时间,当然,这里的时间并非我们所说的时分秒,而是系统版本号(system version number),列存储的SVN是事物开始时刻的SVN,每开始一个新的事物,SVN号递增。 MVCC只有在隔离级别是READ COMMITED(Oracle默认)和REPEATABLE READ(MySQL默认)两个隔离级别下工作。 现在讨论在REPEATABLE READ下的MVCC实现: SELECT a. Innodb查找SVN小于等于当前事物的SVN的行,如果是小于,说明行之前就已经存在,如果是等于,说明这行是事物本身修改过的. b.行的删除时间列要么为空(说明该行未被删除)要么删除时间列的SVN大于当前事物的SVN(表示行是在事物开始之后被删除的). 只有记录满足以上两条