首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle中读一致性描述的一些混淆

Oracle中读一致性描述的一些混淆
EN

Stack Overflow用户
提问于 2018-07-03 12:22:30
回答 1查看 274关注 0票数 0

下面是一个简短的阅读一致性从甲骨文概念指南。

什么是sql语句,只有一个sql语句?或者Pl/SQL或者存储过程?有人可以帮我提供一个相反的例子,它可以指示不一致性读取?

代码语言:javascript
复制
 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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-03 12:49:51

这个上下文中的“语句”是一个DML语句:一个SELECTINSERTUPDATEDELETEMERGE

它不是PL/SQL块。类似地,对同一个DML语句的多次执行(例如,在PL/SQL循环中)是单独的“语句”。如果需要在多个语句或PL/SQL块中保持一致性,则可以使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLESET TRANSACTION READ ONLY实现这一点。两者都有局限性。

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

启动条件:表BIG_TABLE有1000万行。

用户A在10:00:

代码语言:javascript
复制
SELECT COUNT(*) FROM BIG_TABLE;

用户B: 10:01:

代码语言:javascript
复制
DELETE FROM BIG_TABLE WHERE ID >= 9000000;  -- delete the last million rows

用户B: 10:02:

代码语言:javascript
复制
COMMIT;

用户A在10:03:查询完成:

代码语言:javascript
复制
COUNT(*)
--------------
9309129

这是不对的。用户A应该得到1000万行或900万行。表中没有9309129行已提交的行。所发生的情况是,用户A在Oracle实际处理删除之前(或在COMMIT之前)读取了用户B正在删除的309,129行。然后,在用户B删除/提交之后,用户A的查询停止查看已删除的行并停止计数。

这种问题在Oracle中是不可能的,因为它实现了多版本读取一致性。

在Oracle中,由于遇到用户B删除(并提交)行的块,用户A的查询将使用UNDO数据重构这些块在10:00时的样子--即用户A开始查询的时间。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51154554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档