mysql知识归纳汇总,innodb的mvcc与理想mvcc区别
转 https://segmentfault.com/a/1190000039945447
innodb的mvcc与理想mvcc区别
通常MVCC有下面几个特色:
每行数据都存在一个版本,每次数据更新时都更新该版本
修改时Copy出当前版本, 而后随意修改,各个事务之间无干扰
保存时比较版本号,若是成功(commit),则覆盖原记录, 失败则放弃copy(rollback)
就是每行都有版本号,保存时根据版本号决定是否成功,听起来含有乐观锁的味道, 由于这看起来正是,在提交的时候才能知道到底可否提交成功
而InnoDB实现MVCC的方式是:
事务以排他锁的形式修改原始数据
把修改前的数据存放于undo log,经过回滚指针与主数据关联
修改成功(commit)啥都不作,失败则恢复undo log中的数据(rollback)
两者最本质的区别是: 当修改数据时是否要排他锁定
innodb算不上真正的mvcc,由于没有实现核心的多版本共存。其缘由是理想mvcc对多行数据无能为力。
譬如,若是事务A执行理想的MVCC, 修改Row1成功, 而修改Row2失败, 此时须要回滚Row1, 但由于Row1没有被锁定, 其数据可能又被事务B所修改, 若是此时回滚Row1的内容,则会破坏事务B的修改结果,致使事务B违反ACID。 这也正是所谓的 第一类更新丢失的状况
本文来自博客园,作者:up~up,转载请注明原文链接:https://www.cnblogs.com/soft-engineer/articles/15132411.html