2015-10-19 209 views
2

Oracle不允许脏读,因此甚至不允许从JDBC设置读未提交。MySQL InnoDB如何实现读未提交隔离级别

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

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

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

+2

你见过这个博客吗? https://www.percona.com/blog/2015/01/14/mysql-performance-implications-of-innodb-isolation-modes/ – Shadow

回答

1

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

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

编辑:就展开回滚段的性能而言,是的,它可能会很慢,并且有很多修订。 AFAIK这是一个简单的链接列表,并且可能需要许多遍历。与PostgreSQL的比较是很难做到的,因为体系结构(mysql特性UNDO)是完全不同的。一般来说,我认为当搬迁是“合乎逻辑的+适合工作集合”时,UNDO运作良好;即它在内存中执行,但在需要物理IO之前清理。