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。 这也正是所谓的 第一类更新丢失的状况

posted @ 2021-08-12 14:01  up~up  阅读(50)  评论(0编辑  收藏  举报