V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Renco
V2EX  ›  数据库

<高性能 MySQL>对 MVCC 的描述

  •  
  •   Renco · 2019-09-24 15:39:05 +08:00 · 1843 次点击
    这是一个创建于 1668 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当执行 select 操作时候:

    1. 只查找版本早于当前事务版本的数据行。 确保事务读取的行,在事务开始之前就存在的,或者是事务自身插入或者修改过的。
    2. 行的删除版本号要么未定义,要么大于当前事务版本号。 确保事务查询到的行,在事务开始之前没被删除。

    针对这句话的理解,那一个事务未提交的情况下,又创建了新的事务,那这个事务的版本号是比之前未提交的事务高吗?那这样之前未提交事务的修改或者插入也能在当前事务下查询出来,是不是有点问题。还是要怎么理解。

    感觉没有弄懂 MVCC 的工作机制。有点混乱,求解答。

    3 条回复    2019-09-24 16:44:43 +08:00
    polythene
        1
    polythene  
       2019-09-24 15:47:58 +08:00
    这个要看隔离级别了,未提交的事务是有可能被查出来,那是在 Read Uncommitted 情况下。所以你的问题应该是:MySQL 的隔离级别是怎样实现的。

    我没有看过 MySQL 源代码,但同样用了 MVCC 的 etcd 我知道它是怎么做隔离的,最近刚好写了一篇介绍,希望能帮助你理解: http://blog.betacat.io/post/2019/08/learn-transaction-isolation-levels-from-etcd/
    arrow8899
        2
    arrow8899  
       2019-09-24 16:06:56 +08:00
    事务开始之前,会记录当前 active 的所有事务 id => ids,读取数据的时候从版本链中选择比 min(ids) 小的版本号;由于版本号递增,也就是当前正在执行的事务产生的修改对其它事务是不可见的。
    DonaldY
        3
    DonaldY  
       2019-09-24 16:44:43 +08:00
    感觉是:`只查找版本早于当前事务版本的数据行。` 这个理解有误。

    查找到的是 最新已提交事务版本号记录。

    未提交的是不可见的。ACID 再看下吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3393 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:40 · PVG 08:40 · LAX 17:40 · JFK 20:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.