【问题标题】:What's the actual difference between MySQL InnoDB implementations of Repeatable Read and Serializable可重复读取和可序列化的 MySQL InnoDB 实现之间的实际区别是什么
【发布时间】:2016-01-12 01:59:34
【问题描述】:

根据 SQL 标准,Repeatable Read 应该防止模糊读取和脏读,而 Serializable 还应该防止幻读。

根据MySQL documentation

默认情况下,InnoDB 在 REPEATABLE READ 事务隔离中运行 等级。在这种情况下,InnoDB 使用 next-key 锁进行搜索和索引 扫描,这可以防止幻像行(请参阅第 14.2.2.5 节,“避免 使用 Next-Key Locking 的幻影问题”)。

如果可重复读取也可以防止幻读,那么可序列化提供什么作为回报?

Serializable 是否可以防止写入偏斜或读取偏斜而可重复读取却没有?

【问题讨论】:

    标签: mysql transactions isolation-level


    【解决方案1】:

    答案也可以在mysql documentation中找到,引用:

    这个级别类似于 REPEATABLE READ,但如果禁用自动提交,InnoDB 会隐式地将所有普通的 SELECT 语句转换为 SELECT ... LOCK IN SHARE MODE。如果启用了自动提交,则 SELECT 是它自己的事务。因此,它是只读的,并且如果作为一致(非锁定)读取执行并且不需要阻塞其他事务,则可以序列化。

    当使用两阶段锁定实现时,可序列化的事务调度可以防止读写偏差。这就是它在使用锁定的 SQL Server 或使用其可序列化快照隔离的 PostgreSQL 上的工作方式。

    如果在正在读取的任何资源上获取共享锁,则也会防止读取倾斜和写入倾斜。

    【讨论】:

    • 这是正确的(当然)。我的评论是 RR 和 RC 使用 MVCC,其中通过 SELECT 语句可以获取更早但正确的每一行代。所以从并发的角度来看,通常不推荐使用serializable。
    猜你喜欢
    • 2013-08-02
    • 2012-11-02
    • 2023-03-08
    • 2021-06-12
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多