InnoDB mvcc

资料:

MySQL-InnoDB-MVCC多版本并发控制

快照读:

  select

  实现:MVCC 和 undo log

当前读:

  select for update / in share mode

  insert

  update

  delete

  实现:record lock 和 gap lock

InnoDB的mvcc与理想的mvcc:

  1. 一般我们认为MVCC有下面几个特点:

    • 每行数据都存在一个版本,每次数据更新时都更新该版本
    • 修改时Copy出当前版本, 然后随意修改,各个事务之间无干扰
    • 保存时比较版本号,如果成功(commit),则覆盖原记录, 失败则放弃copy(rollback)
    • 就是每行都有版本号,保存时根据版本号决定是否成功,听起来含有乐观锁的味道, 因为这看起来正是,在提交的时候才能知道到底能否提交成功
  2. 而InnoDB实现MVCC的方式是:

      • 事务以排他锁的形式修改原始数据
      • 把修改前的数据存放于undo log,通过回滚指针与主数据关联
      • 修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback) 
  3. 二者最本质的区别是: 当修改数据时是否要排他锁定,如果锁定了还算不算是MVCC?
  • Innodb的实现真算不上MVCC, 因为并没有实现核心的多版本共存, undo log 中的内容只是串行化的结果, 记录了多个事务的过程, 不属于多版本共存。但理想的MVCC是难以实现的, 当事务仅修改一行记录使用理想的MVCC模式是没有问题的, 可以通过比较版本号进行回滚, 但当事务影响到多行数据时, 理想的MVCC就无能为力了。

 

原文地址:https://www.cnblogs.com/GY8023/p/13726617.html