› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
sunkuku
V2EX  ›  MySQL

Mysql Innodb 存储引擎 的 MVCC 如何保证可重复读

  •  
  •   sunkuku · Oct 19, 2017 · 6240 views
    This topic created in 3273 days ago, the information mentioned may be changed or developed.

    例如按照下面时间顺序执行

    • 事务 A 开始,版本号 1
    • 事务 B 开始,版本号 2
    • 事务 B 查询数据
    • 事务 A 插入数据
    • 事务 B 查询数据

    因为 B 查询的数据要求是 createdAt < B.version && (deletedAt > B.version || deletedAt = null)

    那么在事务 B 中,第一次查询到的记录和第二次查询到的记录是不一样的

    这个怎么解释?

    9 replies  •  2017-10-31 11:08:17 +08:00
    ixiaohei
        1
    ixiaohei  
       Oct 19, 2017
    版本号和回滚段保证可重复读。
    sunkuku
        2
    sunkuku  
    OP
       Oct 19, 2017
    @ixiaohei
    在我的例子里,A 的版本号小于 B。所以 B 是可以查到 A 添加的数据的,不是吗?
    domty
        3
    domty  
       Oct 19, 2017
    Next-Key Lock
    namedfish
        4
    namedfish  
       Oct 19, 2017 via iPhone
    在隔离级别为可重复读的情况下可以保证,详情可以 google mysql 隔离级别设置
    ixiaohei
        5
    ixiaohei  
       Oct 19, 2017
    @sunkuku 我说错了,mysql 的 mvvc 的可以保证重复读,但是幻读是间隙锁还是什么东西保证的,具体可以读 mysql 官方文档。
    另外你说的读到另外新插入的行这个是幻读,不是可重复读,可重复读这个隔离级别不保证幻读的。但是 mysql 可重复度貌似解决幻读(当时读文档很是因垂丝丁)
    sunkuku
        6
    sunkuku  
    OP
       Oct 23, 2017
    终于把这个问题研究清楚了。
    首先感谢 @ixiaohei @domty @namedfish 的回答,但是你们的回答不能解释我提出的问题。
    我想表达的是:在 Mysql 中,MVCC 如何保证不会读到并发事务的其他插入行?
    这个问题在于很多文章在解释 MVCC 原理的时候有偏差。其实 Innodb 做的事情并不是简单的使用 createdAt 和 deletdAt,他用的是 tx_id 和 db_roll_ptr。其中 db_roll_ptr 指向 undo log。这个是 MVCC 的精髓所在。具体的我会写一篇文章,专门介绍下。
    @ixiaohei 说的是接近的,靠的是事务号和回滚段。
    sunkuku
        7
    sunkuku  
    OP
       Oct 23, 2017
    这个是一个非常典型的误导讲解
    http://blog.csdn.net/whoamiyang/article/details/51901888
    后面我会说明他为什么是错的
    ixiaohei
        8
    ixiaohei  
       Oct 23, 2017
    @sunkuku 你要研究深,还有个快照读和当前读区别,一般 mvcc 只是保证快照读可重复读,另外当前读应该就是间隙锁保证的(这个我不是很了解)
    sunkuku
        9
    sunkuku  
    OP
       Oct 31, 2017
    这个是 MVCC 实现原理的文章,放在团队博客上了
    http://fridaytalk.org/archives/20/
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2512 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 560ms · UTC 13:15 · PVG 21:15 · LAX 06:15 · JFK 09:15
    ♥ Do have faith in what you're doing.