【问题标题】:Does oracle allow the uncommitted read option?oracle 是否允许未提交的读取选项?
【发布时间】:2019-07-03 21:45:48
【问题描述】:

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

【问题讨论】:

    标签: oracle


    【解决方案1】:

    Tom 对此给出了很好的回答:On Transaction Isolation Levels

    他说:

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

    ...

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

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

    【讨论】:

    • 执行摘要:你不需要它,因为 oracle 已经做了正确的事情。
    • “你不需要它,因为 oracle 不支持它”会更公平。脏读大大简化了应用程序的调试。遗憾的是 Oracle 没有提供此功能。
    • 在这里我认为它可能是需要的。现在我正在运行和调试一个复杂的 PL/SQL 块,我想检查表是否正在实际更新或块在某处冻结。多亏了 Oracle 的想法,什么是错的,什么是我需要的,我被剥夺了一个工具(尽管很少有效地使用)。但是,当它以有效的方式使用时,它就是无价之宝。
    • 如果不需要,我该如何回答“有多少未提交的行被添加到表中?”?
    • @Jacob - 如果我要添加未提交的行,那么我会在添加它们时计算它们,或者在添加之前将它们计为候选行;如果其他人正在添加它们,那么那是在另一笔交易中,而不是您应该有权访问或担心的事情,我想这是汤姆的观点。
    【解决方案2】:

    Tom Kyte 的回答是正确的 WRT 预言机,由于其多版本并发控制 (MVCC) 架构,不存在脏读之类的东西。

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

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

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

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

    • 所有产品列表

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

    • 库存产品列表

    Oracle 甚至不考虑脏读,也不能将其“作为一项功能添加”而不真正失去性能优势(即在 Oracle 真正的 MVCC 架构中获取脏数据需要太多技巧) .

    【讨论】:

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

    凭你的理由:当涉及到 SELECT ONLY(报告)查询时,等待提交是没有意义的。如果您正在报告正在更新的表,那么您是否获得该更新是无关紧要的。脏读与提交后的数据一样有效。考虑一下查询是否在一秒前命中了该锁定记录。

    如果您对更改的表运行查询,则不会获得任何设定的时间点。查询开始时访问的数据比查询结束时访问的数据更早。查询结果中可能包含或不包含对表的大量更新。

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

    (ps。只需设置我的帐户,因此我无法评论其他回复。)

    【讨论】:

      【解决方案4】:

      虽然上述答案确实正确,但您可以查看 Autonomous Transactions,但请记住,不推荐使用它们,您可以查看此处 Autonomous Transactions 和此处的缺点 Autonomous Transactions a Poor Mis-Understood Feature .

      【讨论】:

      • 更适合作为评论。
      • 是的。你的权利,但由于我没有 50 个代表,我无法发表评论。这就是帖子的原因。
      【解决方案5】:

      嗯, UR 表示跨其他长期运行事务的提交边界的未提交读取。脏读是未提交读的旧术语。在 DB2 中读取不完整的物理页面是不可能的,我希望在 Oracle 中也是如此。 我定位 SET ISOLATION LEVEL READ UNCOMMITTED,在 Oracle 中似乎也可以。 从获得一致性的角度来看,我更喜欢 READ UNCOMMITTED,因为 CS 可能会因为未达到值而生成一个表的序列化不同返回。这可能不是报告或转储的要求。例如。如果您想知道(理论上)稍后将提交的交易的价值......

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

      【讨论】:

      • 这在问题的上下文中是错误的...链接指的是可以设置事务隔离的 JavaDB(又名 Apache Derby)。
      猜你喜欢
      • 2015-05-20
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2010-12-06
      • 2011-07-24
      • 1970-01-01
      • 2011-07-07
      相关资源
      最近更新 更多