V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
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
whatevers
V2EX  ›  MySQL

innodb RR 隔离级别下的小问题

  •  
  •   whatevers · Feb 5, 2021 · 3121 views
    This topic created in 1912 days ago, the information mentioned may be changed or developed.

    1 、read_view 中维护了系统中活跃事务集合的快照,这些活跃事务 ID 的最小值为 up_limit_id,最大值为 low_limit_id ; SELECT 操作返回结果的可见性是由以下规则决定的:

    DB_TRX_ID < up_limit_id  -> 此记录的最后一次修改在 read_view 创建之前,可见
    
    DB_TRX_ID > low_limit_id   -> 此记录的最后一次修改在 read_view 创建之后,不可见  ->  需要用 DB_ROLL_PTR 查找 undo log(此记录的上一次修改),然后根据 undo log 的 DB_TRX_ID 再计算一次可见性
    
    up_limit_id <= DB_TRX_ID <= low_limit_id -> 需要进一步检查 read_view 中是否含有 DB_TRX_ID
    	DB_TRX_ID ∉ read_view  -> 此记录的最后一次修改在 read_view 创建之前,可见
    	DB_TRX_ID ∈ read_view -> 此记录的最后一次修改在 read_view 创建时尚未保存,不可见  -> 需要用 DB_ROLL_PTR 查找 undo log(此记录的上一次修改),然后根据 undo log 的 DB_TRX_ID 再从头计算一次可见性
    

    2 、RR 隔离级别下:read view 是在 first touch read 时创建的,也就是执行事务中的第一条 SELECT 语句的瞬间,后续所有的 SELECT 都是复用这个 read view,所以能保证每次读取的一致性(可重复读的语义)

    按照这个说法,RR 隔离级别下是读取不到其他事务插入的数据的,那为什么还需要 next-key lock 算法加锁来阻止其他事务的插入呢

    求大佬解惑

    9 replies    2021-02-06 14:16:50 +08:00
    XiLemon
        1
    XiLemon  
       Feb 5, 2021
    mvcc 可以解决快照读的幻读,当前读还是要用 Next-key lock 吧
    radiocontroller
        2
    radiocontroller  
       Feb 5, 2021
    RR 隔离级别下是读取不到其他事务插入的数据的
    radiocontroller
        3
    radiocontroller  
       Feb 5, 2021
    @radiocontroller RR 隔离级别下是读取不到其他事务插入的数据的,这里是快照读。那为什么还需要 next-key lock 算法加锁来阻止其他事务的插入呢,这里是当前读
    bringyou
        4
    bringyou  
       Feb 5, 2021
    我感觉是为了解决幻读
    xixihaha1
        5
    xixihaha1  
       Feb 5, 2021
    mvcc 可以解决“快照读”的幻读问题,但是解决不了“当前读”的幻读问题
    whatevers
        6
    whatevers  
    OP
       Feb 5, 2021
    @XiLemon @radiocontroller 恍然大悟,忽略了读的上下文,多谢两位大佬
    awanganddong
        7
    awanganddong  
       Feb 5, 2021
    备注下:

    当前读
    当前读是基于 临键锁(行锁 + 间歇锁)来实现的,适用于 insert,update,delete,select ... for update,select ... lock in share mode 语句,以及加锁了的 select 语句。

    更新数据时,都是先读后写,而这个读,就是当前读。读取数据时,读取该条数据的已经提交的最新的事务,生成的 readView 。
    YouLMAO
        8
    YouLMAO  
       Feb 5, 2021
    like share and Subscribe
    zzkde
        9
    zzkde  
       Feb 6, 2021
    low_limit_id 指的不是系统中活跃事务的最大 ID,应该是系统要生成的下一个事务 ID 。可以试想这种情况:ReadView 创建时,系统中活跃的最大事务 ID 可能已经存在很久了,这期间也会提交事务(在 ReadView 创建时就已提交),这些提交了的事务应该是可见的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2287 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 00:21 · PVG 08:21 · LAX 17:21 · JFK 20:21
    ♥ Do have faith in what you're doing.