【发布时间】:2019-07-03 21:45:48
【问题描述】:
在 db2 中,带有“with ur”子句的查询允许查询是未提交的读取,mysql 中的“with nolock”子句也是如此。 oracle中也有这样的选择吗...如果不是为什么??
【问题讨论】:
标签: oracle
在 db2 中,带有“with ur”子句的查询允许查询是未提交的读取,mysql 中的“with nolock”子句也是如此。 oracle中也有这样的选择吗...如果不是为什么??
【问题讨论】:
标签: oracle
Tom 对此给出了很好的回答:On Transaction Isolation Levels
他说:
未提交的读取 隔离级别允许脏读。 Oracle 数据库不使用脏数据 读取,甚至不允许它们。 READ UNCOMMITTED 的基本目标 隔离级别是提供一个 基于标准的定义,允许 用于非阻塞读取。
...
现在,一个允许脏的数据库 阅读......它不仅返回 错误的答案,但它也返回...... [一个答案]......表中从未存在过。 在多用户数据库中,脏读 可能是一个危险的功能。 就个人而言,我从未见过 它的用处...
这里的重点是脏读是 不是特征;相反,它是一个 责任。在 Oracle 数据库中,它是 只是不需要。你得到所有的 脏读的优点——没有 阻塞——没有任何不正确的 结果。
【讨论】:
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 架构中获取脏数据需要太多技巧) .
【讨论】:
凭你的理由:当涉及到 SELECT ONLY(报告)查询时,等待提交是没有意义的。如果您正在报告正在更新的表,那么您是否获得该更新是无关紧要的。脏读与提交后的数据一样有效。考虑一下查询是否在一秒前命中了该锁定记录。
如果您对更改的表运行查询,则不会获得任何设定的时间点。查询开始时访问的数据比查询结束时访问的数据更早。查询结果中可能包含或不包含对表的大量更新。
使用 WITH UR 和其他 DBMS 等效项可提高性能,因为查询不会等待提交,也不会导致数据完整性损失。
(ps。只需设置我的帐户,因此我无法评论其他回复。)
【讨论】:
虽然上述答案确实正确,但您可以查看 Autonomous Transactions,但请记住,不推荐使用它们,您可以查看此处 Autonomous Transactions 和此处的缺点 Autonomous Transactions a Poor Mis-Understood Feature .
【讨论】:
嗯, UR 表示跨其他长期运行事务的提交边界的未提交读取。脏读是未提交读的旧术语。在 DB2 中读取不完整的物理页面是不可能的,我希望在 Oracle 中也是如此。 我定位 SET ISOLATION LEVEL READ UNCOMMITTED,在 Oracle 中似乎也可以。 从获得一致性的角度来看,我更喜欢 READ UNCOMMITTED,因为 CS 可能会因为未达到值而生成一个表的序列化不同返回。这可能不是报告或转储的要求。例如。如果您想知道(理论上)稍后将提交的交易的价值......
https://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj41180.html
【讨论】: