oracle是否允许未提交的读取选项?

sar*_*ego 14 oracle

在db2中,带有'with ur'子句的查询允许查询是未提交的读取,mysql中的'with nolock'子句也是如此.在oracle中是否有这样的选项......如果不是为什么?

Nic*_*int 18

Tom为此提供了一个很好的答案:在事务隔离级别上

他说:

READ UNCOMMITTED隔离级别允许脏读.Oracle数据库不使用脏读,也不使用它们.READ UNCOMMITTED隔离级别的基本目标是提供基于标准的定义,允许非阻塞读取.

...

现在,一个允许脏读的数据库...不仅会返回错误的答案,而且还会返回... [答案] ......表中从未存在过.在多用户数据库中,脏读可能是一个危险的功能.就个人而言,我从未见过它的用处......

这里的重点是脏读不是一个特征; 相反,这是一种责任.在Oracle数据库中,它只是不需要.您可以获得脏读 - 无阻塞的所有优点 - 没有任何不正确的结果.

  • “你不需要它,因为 oracle 不支持它”会更公平。脏读大大简化了应用调试。遗憾的是 Oracle 不提供此功能。 (3认同)
  • 在这里,我认为可能需要它。现在我正在运行和调试一个复杂的 PL/SQL 块,我想检查表是否正在实际更新或块在某处冻结。多亏了 Oracle 的想法,出了什么问题以及我需要什么,我才被抢走了一个工具(尽管很少有效地使用)。但是当它以有效的方式使用时,它就是无价的。 (2认同)

小智 5

Tom Kyte 的答案是正确的 WRT oracle,由于其多版本并发控制 (MVCC) 架构,没有脏读之类的东西。

从应用功能的角度,我完全同意Tom;没有充分的理由或脏读。

为什么要在 Oracle 之外使用它?在没有 MVCC(例如 MySQL、Ingres)的情况下,如果没有正确调整,它是解决锁定问题的一个技巧,这些问题可能会降低性能或导致锁定系统“用完锁”。与您需要在 Oracle 中调整回滚/撤消的方式相同,您需要管理非 MVCC 数据库中的锁定系统。

那么为什么它可能对 Oracle 有用——作为只读函数的性能提升,其中“错误数据”极不可能且非常无关紧要。在 MySQL/DB2/Ingres/Informix(不确定 SQL Server/Sybase)中,它可用于绕过锁管理工具以提高性能。

这是读取不需要一致性的情况的示例:

  • 所有产品一览

这是读取需要一致性的情况的示例:

  • 库存产品清单

Oracle 甚至没有想到脏读,也不能在不实际失去性能优势的情况下将其“添加为一个特性”(即在 Oracle 的真正 MVCC 架构中获取脏数据需要太多技巧)。

  • 在存储过程中,当您在日志表中插入记录以进行调试或性能检查,或检查长时间运行的 proc 已实现的步骤时,脏读很有用!我如何使用 Oracle 读取这些记录(就像我在 SQL Server 中使用“nolock”提示一样)? (3认同)
  • 是的,但为什么要强迫人们阅读维基百科上的帖子呢?只需写一次完整的术语,然后您就可以随意使用缩写 (2认同)