mysql INNODB如何实现READ-UNCOMMITTED?

时间:2021-07-23 15:35:38

标签: mysql concurrency innodb isolation-level mvcc

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

1 个答案:

答案 0 :(得分:4)

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

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

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