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

时间:2015-10-19 20:37:47

标签: mysql jdbc transactions read-uncommitted dirtyread

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

当选择Read Uncommitted时,PostgreSQL也会回到Read Committed。

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

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

1 个答案:

答案 0 :(得分:1)

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

如果不需要为READ-UNCOMMITTED事务本身创建读取视图结构(example),则可能会有一些其他性能提升,但我自己并未对此进行确认。一般来说,这不是InnoDB团队针对优化的隔离级别。

编辑:就展开回滚段的性能而言,是的,很多版本都可能会很慢。 AFAIK它是一个简单的链接列表,可能需要许多遍历。与PostgreSQL的比较在这里很难做到,因为架构(mysql功能UNDO)是完全不同的。一般来说,我会说当重新定位时,UNDO运作良好,只有逻辑+适合工作集&#34 ;;即它在内存中执行,但在需要物理IO之前进行清理。

相关问题