MySQL InnoDB如何实现Read Uncommitted隔离级别

How does MySQL InnoDB implement Read Uncommitted isolation level

Oracle 不允许脏读,所以 Read Uncommitted 甚至不允许从 JDBC 设置。

PostgreSQL 在选择未提交读时也会回退到已提交读。

SQL服务器定义了一个Read Uncommitted隔离级别,因为它的并发控制模型是基于锁的(除非切换到两个快照隔离级别),所以它可能是唯一可以看到一些性能优势的数据库避免锁定不需要严格一致性的报告。

InnoDB 也使用 MVCC,但不同于 Oracle 和 PostgreSQL,它允许脏读。为什么会这样?直接转到最新版本而不是从回滚段重建以前的版本是否有任何性能优势?回滚段查询时间是否恢复了这样一个需要允许脏读的密集过程?

我知道的主要优点是,如果您的所有会话都是 READ-UNCOMMITTED,那么内务处理(清理 UNDO)将永远不会被阻止等待旧会话。

如果不需要为 READ-UNCOMMITTED 事务本身创建读取视图结构 (example),可能会有一些其他的性能提升,但我自己还没有证实这一点。一般来说,这不是 InnoDB 团队优化的隔离级别。

编辑:就展开回滚段的性能而言,是的,许多修订可能会很慢。据我所知,这是一个简单的 link 列表,可能需要多次遍历。在这里很难与 PostgreSQL 进行比较,因为架构(mysql 具有 UNDO 功能)非常不同。一般来说,当重定位为 "logical only + fits in working set" 时,我会说 UNDO 工作得很好;即它在内存中执行,但在需要物理 IO 之前被清理。