V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
esolve
V2EX  ›  问与答

MVCC 是如何实现可重复读的?

  •  
  •   esolve · 2017-06-14 04:05:03 +08:00 · 2796 次点击
    这是一个创建于 2507 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看了这篇文章 http://www.cnblogs.com/dongqingswt/p/3460440.html 里面说:

    在查询时要符合以下两个条件的记录才能被事务查询出来:

    1. 删除版本号 大于 当前事务版本号,就是说删除操作是在当前事务启动之后做的。

    2. 创建版本号 小于或者等于 当前事务版本号 ,就是说记录创建是在事务中(等于的情况)或者事务启动之前。

    我现在假设两个事务对一行数据操作,版本号分别为 4,5

    该行数据的 create version 是 3

    id value create-ver delete-ver 3 15 3

    假如版本 5 的事务查询这行数据 value 为 15

    假如 版本 4 的事务过程中更新这数据行,则变成

    id value create-ver delete-ver 3 15 3 4 3 20 4

    这个时候,版本 5 的事务再次查询 因为 delete-ver 为 4 的话,因为不满足删除版本号大于事务版本号,所以不能被查询到 这个时候好像是查到 value 为 20? ( delete-ver 为空,所以不需要满足删除版本号 大于 当前事务版本号?)

    这样哪里体现了可重复读啊?

    BTW: 好像用了 MVCC,update 或者 delete 的时候,老数据行都不被删除,这样数据库岂不是冗余太多?

    8 条回复    2017-06-14 21:37:32 +08:00
    esolve
        1
    esolve  
    OP
       2017-06-14 04:07:19 +08:00
    上面的怎么变成一行了,再试试

    ----------------------------------------------------------

    我现在假设两个事务对一行数据操作,版本号分别为 4,5

    该行数据的 create version 是 3

    id value create-ver delete-ver

    3 15 3

    假如版本 5 的事务查询这行数据 value 为 15

    假如 版本 4 的事务过程中更新这数据行,则变成

    id value create-ver delete-ver

    3 15 3 4

    3 20 4

    这个时候,版本 5 的事务再次查询 因为 delete-ver 为 4 的话,因为不满足删除版本号大于事务版本号,所以不能被查询到 这个时候好像是查到 value 为 20? ( delete-ver 为空,所以不需要满足删除版本号 大于 当前事务版本号?)

    这样哪里体现了可重复读啊?
    miaoever
        2
    miaoever  
       2017-06-14 09:04:00 +08:00
    MySQL MVCC 在 Read repeatable 下,每个事务开始的时候会 “建立”一个 snapshot,事务中的读写都会在这个 snapshot 上执行。

    https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html
    mortonnex
        3
    mortonnex  
       2017-06-14 09:24:45 +08:00 via iPhone
    乐观锁
    esolve
        4
    esolve  
    OP
       2017-06-14 12:24:30 +08:00
    @mortonnex。。。。。你说的真简便。。
    esolve
        5
    esolve  
    OP
       2017-06-14 12:25:01 +08:00
    @miaoever 我上面的例子我的错误在哪里?
    ihuotui
        6
    ihuotui  
       2017-06-14 12:28:13 +08:00 via iPhone
    楼主把 mvcc 和乐观锁两个概念混在一起了。乐观锁也不是这样用。为什么要删除
    esolve
        7
    esolve  
    OP
       2017-06-14 19:36:45 +08:00
    @ihuotui 我是根据那篇文章分析的啊
    ihuotui
        8
    ihuotui  
       2017-06-14 21:37:32 +08:00 via iPhone
    @esolve 不要乱看不知名的文章,描述不清还有可能误导,最好看官方文档即使自己翻译。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1068 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:24 · PVG 03:24 · LAX 12:24 · JFK 15:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.