constant read 和 current read
来自网络,并且在本机实验完成:
我的理解,就是通过scn来读取。 读取的过程中要保证 scn是一致的。举个例子,一个SELECT 语句在SCN=100的时刻开始读取一系列数据块。在执行的过程中,他发现一个数据块的SCN变成了101,也就是说这个数据块被更改过了。那么SELECT 就不去读取这个数据块了,而是去读取它的一个早期版本 ,scn=100的这个版本。 这个版本应该在undo空间中。这就是CONSISTENT read。 这也许让你想到了 oracle的写不影响读 这个机制。 比如一个让update 了一条记录, 只要他没commit, 另一个让在读取这条记录的时候就总是读取原来的值。但实际上,即使那条更改被commit了, 只要你的select 时间点,或者说scn 早于commit,你看到的仍然是之前commit之前的,也就是你提交select那个时间点的记录。接下来的第一条例子,就可以证明这一点。
做一个实验,证明上面的consistent read
1. 现在有表,内容如下
- SQL> select id ,v1,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) from t1;
- ID V1 DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
- ---------- ------------------------ ------------------------------------
- 1 a 68194
- 2 b 68195
复制代码
2. 在session 1 中运行下列语句
- 11:34:51 SQL> select v1 from t1 where id=2 and v1='b' and (select count(*) from dba_objects , dba_tables )>1;
- V1
- ------------------------
- b
- Elapsed: 00:00:31.11
复制代码
注意,这个语句运行了约办分钟,所以我们有充足的时间在这条语句运行完毕之前,执行第三步,
3. 第三步执行了一个update,把id=2,v1='b' 这条记录修改了,并且做了commit。
- SQL> update t1 set v1='M' where id=2 ;
- 1 row updated.
- Elapsed: 00:00:00.01
- SQL> commit;
- Commit complete.
- Elapsed: 00:00:00.02
复制代码
第三步执行完,第二步才返回结果。我们可以看到,虽然第三步commit了,但是第二步没有返回最新的结果。第二步返回的是 其开始时刻 scn的结果。所以,这就是consistent read了。它只根据scn去读取数据块,保证了数据的完整性,即不会被后来的更新所改变。
current read,读取当前的 data block,最新的 data block,比如在update, delete的时候就总是current read。 因为你要对最新的data block做更改,对过去更改没有任何实际意义。
下面是我自己的实验过程。
1. 首先看一下,我的表 id=2这一行的记录。可以看到 id=2 对应着 v1=b
- SQL> select id ,v1,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) from t1;
- ID V1 DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
- ---------- ------------------------ ------------------------------------
- 1 a 68194
- 2 b 68195
复制代码
2. 我们新开一个session,并输入下面的语句
- 11:49:06 SQL> update t1 set v1='B' where id=2 and v1='b' and (select count(*) from dba_objects , dba_tables )>1;
- 0 rows updated.
- Elapsed: 00:01:41.14
复制代码
这个SQL执行了一分钟的时间,因为后面的(select count(*) from dba_objects,dba_tables)这个条件非常的耗时。在输入了这条语句,并且该语句运行完之前,我们来做第三步
3.打开第二个session,输入下面的语句
- SQL> update t1 set v1='M' where id=2;
- 1 row updated.
- Elapsed: 00:00:00.01
- SQL> commit;
复制代码
因为,第二步要执行一分钟,所以我们有充足的时间在第二步完成之前完成第三步。可以看到,第三步完成后,第二步才返回结果--更新了0行。
整个的执行过程可以这样描述,
session 1 开始了一个update 操作,他通过consistent read(id= 2 , v1='b') 获取了数据块的id。
session 2 修改了 id=2 这一行的数据,变成了id=2,v1=‘M'
session 1 通过一个通过最开始拿到的block id去以current read读取数据块,结果发现数据块不符合filter的条件了 id=2 and v1='b'
所以 session 1没有更新。
constant read 和 current read的更多相关文章
- Openfire Strophe开发中文乱码问题
网站上有很多Openfire Web方案,之前想用Smack 但是jar包支持客户端版本的,还有JDK版本问题 一直没调试成功 估计成功的方法只能拜读源码进行修改了. SparkWeb 官网代码很 ...
- 手把手教你配置UltraEdit对Oracle的PLSQL着色
http://hi.baidu.com/kingbridge/blog/item/94e225ad5fad4b194b36d60d.html UltraEdit-32 12.1版本配置默认文件显示 ...
- Netezza SQL Analytic Functions 分析函数
应用场景: 分组排序,分组累加求和... 基本语法: Func( value_expression) OVER ( [<partition_by_clause>] [<order_b ...
- TelephonyManager类与PhoneStateListener
public class TelephonyManager extends Object java.lang.Object android.telephony.TelephonyManage ...
- asp中的md5/sha1/sha256算法收集
对于asp这种古董级的技术,这年头想找一些有用的资料已经不容易了,下面是一些常用的加密算法: md5 (将以下代码另存为md5.inc) <% Private Const BITS_TO_A_B ...
- js实现密码加密
http://www.cnblogs.com/mofish/archive/2012/02/25/2367858.html 1.base64加密 在页面中引入base64.js文件,调用方法为: &l ...
- 常用JS加密编码算法
//#region UTF8编码函数 function URLEncode(Str) { if (Str == null || Str == "") return "&q ...
- Android提供的系统服务之--TelephonyManager(电话管理器)
Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设 ...
- (转载)常用JS加密编码算法 五:SHA1算法
(转载)http://neil-yang.iteye.com/blog/703470 /* * A JavaScript implementation of the Secure Hash Algor ...
随机推荐
- python-Web-django-时间插件-三级联动
时间插件: 第一步:下载 https://www.layui.com/laydate/ 下载插件包,放在项目的static 第二步:在html里引入js: <script src="/ ...
- OpenStack组件——Horizon Web界面管理服务
1.horizon 介绍 理解 horizon Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 , ...
- 【Deep Learning Nanodegree Foundation笔记】第 10 课:Sentiment Analysis with Andrew Trask
In this lesson, Andrew Trask, the author of Grokking Deep Learning, will walk you through using neur ...
- WDS部署基础知识:使用WDS捕获与应用映像(使用WDS定制系统和应用)
WDS部署基础知识:使用WDS捕获与应用映像(使用WDS定制系统和应用) Win7部署基础知识(8):使用WDS捕获与应用映像 一.添加映像组 使用WDS捕获映像时,会将映像加载到WDS服务器的映像 ...
- Java架构师 成长之路 -- 跳出程序员陷阱(转载)
本人也是coding很多年,虽然很失败,但也总算有点失败的心得,不过我在中国,大多数程序员都是像我一样,在一直走着弯路. 如果想成为一个架构师,就必须走正确的路,否则离目标越来越远,正在辛苦工作的程序 ...
- Java 200道题
1. junit用法,before,beforeClass,after, afterClass的执行顺序 一个测试类单元测试的执行顺序为: @BeforeClass –> @Before –&g ...
- 【CSP模拟】小凯的疑惑(DP)
首先,这道题正解的思路是从subtask2而得来的,所以先讲一下subtask2的做法. 因为保证答案不超过long long,所以直接求最大权独立集即可:dp[u][0]表示u点一定不能取的答案,d ...
- [爬虫] selenium介绍
认识selenium 在爬取百度文库的过程中,我们需要使用到一个工具selenium(浏览器自动测试框架),selenium是一个用于web应用程序测试的工具,它可以测试直接运行在浏览器中,就像我们平 ...
- Elasticsearch Metric聚合
首先查看index文档信息 $ curl -XGET "http://172.16.101.55:9200/_cat/indices?v" 输出 health status ind ...
- [转帖]浙江移动容器云在ARM服务器的实践
浙江移动容器云在ARM服务器的实践 2019-07-11 22:27 中文社区 分类:Kubernetes实践分享/开发实战 阅读(427) 评论(0) 国产ARM服务器上面跑K8S集群.. 貌似浪 ...