在db2中,带有'with ur‘子句的查询允许查询是未提交的读操作,mysql中的'with nolock’子句也是如此。在甲骨文中也有这样的选项吗?如果不是为什么??
发布于 2008-10-16 12:15:49
Tom对此给出了一个很好的答案:On Transaction Isolation Levels
他说:
READ UNCOMMITTED隔离级别允许脏读。Oracle数据库不使用脏读,甚至也不允许使用脏读。读取未提交隔离级别的基本目标是提供允许非阻塞读取的基于标准的定义。
..。
现在,一个允许脏读的数据库...它不仅返回错误的答案,而且还返回...答案是..。根本不存在于表中。在多用户数据库中,脏读操作可能是一个危险的特性。就我个人而言,我从未见过它的用处...
这里的重点是脏读不是一个特性;相反,它是一种负担。在Oracle数据库中,它是不需要的。您获得了脏读的所有优点-没有阻塞-没有任何不正确的结果。
发布于 2008-10-16 14:12:28
Tom Kyte的回答是正确的WRT oracle,由于其多版本并发控制(MVCC)架构,没有脏读这回事。
从应用程序功能的角度来看,我完全同意Tom的观点;没有很好的理由或脏读。
为什么要在Oracle之外使用它?在没有MVCC的地方(例如MySQL,Ingres)它是一个技巧,可以绕过锁定问题,这些问题可能会降低性能或导致锁定系统在没有正确调整的情况下“用完锁定”。与在Oracle中调优回滚/撤消的方式相同,您也需要管理非MVCC数据库中的锁定系统。
为什么它对有用--作为只读函数的性能提升,因为在只读函数中,“错误数据”是非常不可能和非常无关紧要的。在MySQL/DB2/Ingres/Informix (不确定SQL Server/Sybase)中,它可用于绕过锁管理工具以提高性能。
下面是一个读取不需要一致性的情况的示例:
下面是一个读取需要一致性的情况的示例:
Oracle甚至没有想到脏读,也不能在不实际失去性能优势的情况下将其“添加为一个特性”(即,在Oracle真正的MVCC架构中获取脏数据需要太多技巧)。
发布于 2018-02-08 04:44:14
使用UR原理的:当涉及到仅选择(报告)查询时,等待提交是没有意义的。如果您正在报告正在更新的表,则无论您是否获得更新都是无关紧要的。脏读与提交后的数据一样有效。考虑一下,如果查询早一秒命中了该锁定记录。
如果对正在更改的表运行查询,则不会获得任何设置时间点。在查询开始时访问的数据比在查询结束时访问的数据处于更早的时间点。可能有许多对表的更新,这些更新可能包含在查询结果中,也可能不包含。
与UR和其他DBMS等效项一起使用,可提供性能提升,因为查询不会等待提交,并且它不会在数据完整性方面引入任何损失。
(ps。只需设置我的帐户,这样我就无法对其他回复发表评论。)
https://stackoverflow.com/questions/208236
复制相似问题