【问题标题】:How does mysql INNODB implement READ-UNCOMMITTED?mysql INNODB如何实现READ-UNCOMMITTED?
【发布时间】:2021-07-23 15:35:38
【问题描述】:

我读到 mysql INNODB 使用 MVCC(乐观)来解决 READ_COMMITTED 和 REPEATABLE_READ 隔离级别(和)2PL(悲观)来解决 SERIALIZABLE。但没有提到它如何解决 READ_UNCOMMITTED。

  • 我打开了两个具有 READ_UNCOMMITTED 隔离级别的 mysql 会话。在这两个会话中,我都尝试更新相同的记录。在第一个会话中,它得到了更新,但在第二个会话中,它正在等待第一个会话提交/回滚。这是谁锁的?因为这里显然没有 MVCC 或 2PL 的参与。

  • 写-写冲突 -> 另外,我在所有隔离级别中都看到了相同的行为,至少在 READ_COMMITTED 和 REPEATABLE_READ 中,这是由 MVCC 解决的,当第一个会话更新一行时,第二个会话等待。我知道 MVCC 在以下情况下不会锁定,

    i) 第一次阅读(和)第二次阅读

    ii)第一次写作(和)第二次阅读

    iii) 第一次阅读(和)第二次写作

“读者不会阻止作家,作家不会阻止读者”这句话是正确的。 但是,在这种情况下,

iv) 第一次会话写入(和)第二次会话写入 - INNODB 是否锁定事务并等到其他提交/回滚?

Mysql 版本:5.7.32 引擎:INNODB

【问题讨论】:

    标签: mysql concurrency innodb isolation-level mvcc


    【解决方案1】:

    无论隔离级别如何,都会发生锁定。未提交的读取不是免费的。

    第一个会话锁定了它作为更新的一部分检查的行,其方式与在任何其他隔离级别中的方式完全相同。会话持有这些锁,直到它提交其事务或回滚。这也与任何其他隔离级别相同。

    顺便说一句,在使用 SQL 数据库 30 多年的时间里,我从未遇到过 read-uncommitted 的合法用途。

    【讨论】:

    • 那么,mysql 提供了开箱即用的锁定功能?那么为了控制不一致性,像 2PL 这样的并发控制技术会引入额外的锁定吗?
    • 是的,MySQL (InnoDB) 确实对所有写入或锁定读取进行锁定。 Serializable 不进行悲观锁定,它只是将非锁定读取转换为锁定读取,就像您对所有读取查询执行 SELECT ... LOCK IN SHARE MODE 一样。这就是乐观锁定。
    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    相关资源
    最近更新 更多