0

以下是 Oracle 概念指南中读取一致性的简短介绍。

什么是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.
4

1 回答 1

4

此上下文中的“语句”是一个 DML 语句:单个SELECT, INSERT, UPDATE, DELETE, MERGE.

不是PL/SQL 块。类似地,同一 DML 语句的多次执行(例如,在 PL/SQL 循环中)是单独的“语句”。如果您需要多个语句或 PL/SQL 块内的一致性,您可以使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLEor来实现SET TRANSACTION READ ONLY。两者都引入了限制。

不一致读取的相反示例如下。

起始条件:表BIG_TABLE有1000万行。

10:00 用户 A:

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 中是不可能的。

在 Oracle 中,在上述情况下,当遇到用户 B 删除(并提交)行的块时,用户 A 的查询将使用 UNDO 数据重建这些块在 10:00 时的样子——用户 A 的时间查询开始。

基本上就是这样——Oracle 语句在数据库的一个版本上运行,因为它存在于单个时间点。这个时间点几乎总是语句开始的时间。当那个时间点将被移动到一个时间点“中间语句”时,有一些涉及更新的例外情况。但它在某个时间点或另一个时间点始终是一致的。

于 2018-07-03T12:49:51.770 回答