下面是一个简短的阅读一致性从甲骨文概念指南。
什么是sql语句,只有一个sql语句?或者Pl/SQL或者存储过程?有人可以帮我提供一个相反的例子,它可以指示不一致性读取?
read consistency
A consistent view of data seen by a user. For example, in statement-level read
consistency the set of data seen by a SQL statement remains constant throughout
statement execution.发布于 2018-07-03 12:49:51
这个上下文中的“语句”是一个DML语句:一个SELECT、INSERT、UPDATE、DELETE、MERGE。
它不是PL/SQL块。类似地,对同一个DML语句的多次执行(例如,在PL/SQL循环中)是单独的“语句”。如果需要在多个语句或PL/SQL块中保持一致性,则可以使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE或SET TRANSACTION READ ONLY实现这一点。两者都有局限性。
不一致读取的相反示例如下所示。
启动条件:表BIG_TABLE有1000万行。
用户A在10:00:
SELECT COUNT(*) FROM BIG_TABLE;用户B: 10:01:
DELETE FROM BIG_TABLE WHERE ID >= 9000000; -- delete the last million rows用户B: 10:02:
COMMIT;用户A在10:03:查询完成:
COUNT(*)
--------------
9309129这是不对的。用户A应该得到1000万行或900万行。表中没有9309129行已提交的行。所发生的情况是,用户A在Oracle实际处理删除之前(或在COMMIT之前)读取了用户B正在删除的309,129行。然后,在用户B删除/提交之后,用户A的查询停止查看已删除的行并停止计数。
这种问题在Oracle中是不可能的,因为它实现了多版本读取一致性。
在Oracle中,由于遇到用户B删除(并提交)行的块,用户A的查询将使用UNDO数据重构这些块在10:00时的样子--即用户A开始查询的时间。
基本上就是这样-- Oracle语句在数据库的一个版本上操作,因为它存在于单个时间点。这个时间点几乎总是语句开始的时候。有一些例外情况涉及更新,当这个时间点将被移动到一个时间点“中间声明”。但在某一时间点,它总是一致的。
https://stackoverflow.com/questions/51154554
复制相似问题