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

时间:2008-10-16 11:54:17

标签: oracle

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

5 个答案:

答案 0 :(得分:17)

Tom为此提供了一个很好的答案:On Transaction Isolation Levels

他说:

  

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

...

  

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

     

这里的重点是脏读   不是特色;相反,它是一个   责任。在Oracle数据库中,它是   只是不需要。你得到了所有的   脏读的优点   阻止 - 没有任何不正确的   结果

答案 1 :(得分:4)

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

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

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

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

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

  • 所有产品清单

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

  • 库存产品清单

甲骨文只是甚至没有想象的脏读,也不可能是“添加为特征”实际上不松动的性能的好处(即过多的技巧将需要获得甲骨文的真正MVCC架构中的脏数据)

答案 2 :(得分:1)

WITH UR基本原理:当涉及SELECT ONLY(报告)查询时,等待提交是没有意义的。如果您要报告正在更新的表,则无论是否获得该更新都无关紧要。脏读与提交后的数据一样有效。考虑一下查询是否在一秒钟之前达到了锁定记录。

如果针对更改的表运行查询,则无法获得任何设置时间点。在查询开始时访问的数据是在查询结束时访问的数据的较早时间点。表中可能有许多更新,可能包含也可能不包含在查询结果中。

使用WITH UR和其他DBMS等效项,可以提高性能,因为查询不会等待提交,也不会导致数据完整性的任何损失。

(ps。只需设置我的帐户,我就无法对其他回复发表评论。)

答案 3 :(得分:0)

虽然上述答案确实是正确的,但您可以查看自治交易,但请注意,不建议这样做,您可以在此处查看Autonomous Transactions及此处的缺点Autonomous Transactions a Poor Mis-Understood Feature

答案 4 :(得分:0)

好吧, UR表示跨其他长时间运行的事务的提交事务委员会的未提交读操作。脏读是未提交读的旧术语。在DB2中无法读取不完整的物理页面,我也希望在Oracle中也是如此。 我找到SET ISOLATION LEVEL READ UNCOMMITTED,在Oracle中似乎也是可能的。 从一致性的角度来看,我更喜欢READ UNCOMMITTED,因为CS可能会由于未达到值而生成序列化的一张表的不同返回值。这可能不是报告或转储所要求的。例如。如果您想知道-理论上-稍后也会提交的交易的值。

https://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj41180.html