来自网络,并且在本机实验完成:

onsistent 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. 现在有表,内容如下

  1. SQL> select id ,v1,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) from t1;
  2. ID V1                       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  3. ---------- ------------------------ ------------------------------------
  4. 1 a                                                       68194
  5. 2 b                                                       68195

复制代码

2. 在session 1 中运行下列语句

  1. 11:34:51 SQL> select v1 from t1 where id=2 and v1='b' and (select count(*) from dba_objects , dba_tables )>1;
  2. V1
  3. ------------------------
  4. b
  5. Elapsed: 00:00:31.11

复制代码

注意,这个语句运行了约办分钟,所以我们有充足的时间在这条语句运行完毕之前,执行第三步,

3. 第三步执行了一个update,把id=2,v1='b' 这条记录修改了,并且做了commit。

  1. SQL> update t1 set v1='M' where id=2 ;
  2. 1 row updated.
  3. Elapsed: 00:00:00.01
  4. SQL> commit;
  5. Commit complete.
  6. 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

  1. SQL> select id ,v1,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) from t1;
  2. ID V1                       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
  3. ---------- ------------------------ ------------------------------------
  4. 1 a                                                       68194
  5. 2 b                                                       68195

复制代码

2. 我们新开一个session,并输入下面的语句

  1. 11:49:06 SQL> update t1 set v1='B' where id=2 and v1='b' and (select count(*) from dba_objects , dba_tables )>1;
  2. 0 rows updated.
  3. Elapsed: 00:01:41.14

复制代码

这个SQL执行了一分钟的时间,因为后面的(select count(*) from dba_objects,dba_tables)这个条件非常的耗时。在输入了这条语句,并且该语句运行完之前,我们来做第三步

3.打开第二个session,输入下面的语句

  1. SQL> update t1 set v1='M' where id=2;
  2. 1 row updated.
  3. Elapsed: 00:00:00.01
  4. 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没有更新。

 
个人理解:
最终要的就是上面这一段标黄的部分,更新操作并非不遵循读一致性,在更新操作执行查询的那一部分的时候,是遵循读一致性的,只不过在执行更新的时候,做了实时的二次验证罢了。
 
此时,如果在更新操作执行一半的时候,insert 一条符合更新操作查询部分的数据,这条数据是不会被更新操作更新的。因为更新的内容局限在第一次读一致性那个点上的数据了。只能比它少,不能比它多了。

constant read 和 current read的更多相关文章

  1. Openfire Strophe开发中文乱码问题

    网站上有很多Openfire Web方案,之前想用Smack 但是jar包支持客户端版本的,还有JDK版本问题  一直没调试成功  估计成功的方法只能拜读源码进行修改了. SparkWeb 官网代码很 ...

  2. 手把手教你配置UltraEdit对Oracle的PLSQL着色

    http://hi.baidu.com/kingbridge/blog/item/94e225ad5fad4b194b36d60d.html   UltraEdit-32 12.1版本配置默认文件显示 ...

  3. Netezza SQL Analytic Functions 分析函数

    应用场景: 分组排序,分组累加求和... 基本语法: Func( value_expression) OVER ( [<partition_by_clause>] [<order_b ...

  4. TelephonyManager类与PhoneStateListener

    public class TelephonyManager extends Object java.lang.Object      android.telephony.TelephonyManage ...

  5. asp中的md5/sha1/sha256算法收集

    对于asp这种古董级的技术,这年头想找一些有用的资料已经不容易了,下面是一些常用的加密算法: md5 (将以下代码另存为md5.inc) <% Private Const BITS_TO_A_B ...

  6. js实现密码加密

    http://www.cnblogs.com/mofish/archive/2012/02/25/2367858.html 1.base64加密 在页面中引入base64.js文件,调用方法为: &l ...

  7. 常用JS加密编码算法

    //#region UTF8编码函数 function URLEncode(Str) { if (Str == null || Str == "") return "&q ...

  8. Android提供的系统服务之--TelephonyManager(电话管理器)

    Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设 ...

  9. (转载)常用JS加密编码算法 五:SHA1算法

    (转载)http://neil-yang.iteye.com/blog/703470 /* * A JavaScript implementation of the Secure Hash Algor ...

随机推荐

  1. NJCTF (easycrack)

    安装app查看.一个输入框,输入随便输入显示Try again. 放入JEB反编译. 关于输入框监听是第一次见,具体可以看看这个博客https://www.jianshu.com/p/f976c677 ...

  2. NIO 编程模型

    NIO 编程模型 Doug Lea 在 Scalable IO in Java 的 PPT 中描述了 Reactor 编程模型的思想,大部分 NIO 框架和一些中间件的 NIO 编程都与它一样或是它的 ...

  3. hdfs(分布式文件系统)优缺点

    hdfs(分布式文件系统) 优点 支持超大文件 支持超大文件.超大文件在这里指的是几百M,几百GB,甚至几TB大小的文件.一般来说hadoop的文件系统会存储TB级别或者PB级别的数据.所以在企业的应 ...

  4. AS将一个项目导入到另一个项目中

    需求:有项目A,B.需要将B集成到A中,作为A的一个模块. 方法: 1.将B工程的app下面的build.gradle文字中  apply plugin: 'com.android.applicati ...

  5. (4.16)mysql备份还原——物理备份之XtraBackup实践

    关键词:XtraBackup实践,物理备份,xtrabackup备份,innobackupex备份 [1]如何使用? [3]系列:innobackupex --help |more [4]系列:xtr ...

  6. python 求从1加到100的和,join的用法

    li=[] def func3(x): li.append(str(x)) if x==1: return 1 return x+func3(x-1) # print(func3(100)) re=f ...

  7. TestNG并发兼容性测试

    Web测试项目中经常进行浏览器兼容性相关的测试工作,因为兼容性测试的工作重复性相当高,所以导致手工测试效率低下测试人员积极性降低.TestNG提供了并发执行测试用例的功能,可以让测试用例以并发的形式执 ...

  8. Intellij IDEA神器好用到飞起来的配置

    ​   IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境. IntelliJ在业界被公认为最好的java开发工具之一, 尤其在智能代码助手.代码自动提示.重构.J2EE支持 ...

  9. Luogu P5068 [Ynoi2015]我回来了

    题目 Ynoi难得的水题. 首先我们可以\(O(n^2)\)地求出任意两点之间的距离. 然后我们可以\(O(n^3)\)地求出对于任意一个点\(u\),跟它距离\(\le d\)的点的集合. 然后对于 ...

  10. Laravel-admin form 表单是增加或者修改

    Laravel-admin 实现 form 表单是增加或者修改的三种方法,应用情景:1.新增或者修改 form 展示的表单不同:2.新增或者保存前后回调进行其他的操作 1. use Illuminat ...