1

我读到 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

4

1 回答 1

4

无论隔离级别如何,都会发生锁定。Read-uncommitted 不是免费的。

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

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

于 2021-07-23T16:23:42.773 回答