ORACLE 多版本读一致性

 先来看看这段代码:
  while s in (select * from table1) loop
    insert into table1 values(s.field1,s.field2,s.field3,s.field4,s.field5);
  end loop;
  如果是SQL server的开发人员,看到这段代码,肯定会摇头:这段代码有问题,这样递归插入,会一直到表爆掉为止;而ORACLE开发人员,则不会有觉得这段代码有什么不对。
  这是为什么呢?原因就是两个数据库系统的处理机制不一样,假设表table1的内容如下:
  field1  field2  field3  field4  field5
  1       2       3       4       5
  那么SQL server会这样处理:找到table1的第一条记录,把这条记录插入到table1中,这时select * from table1这个查询的内容就变成了
  field1  field2  field3  field4  field5
  1       2       3       4       5
  1       2       3       4       5
  于是循环就移动指针,把第二条记录复制下来插入到table1中,于是select * from table1这个查询又增加了一条记录,于是继续复制...,就这样一直继续下去,直至表被撑满。
  而在ORACLE中,系统指向第一条记录时,会判断这条记录的版本,由于这个版本在查询select * from table1被提交前就存在,所以它会被复制插入,然后指针移向下一记录,也就是刚刚加入的这条,判断它的版本,发现它是在查询提交后生成的,这时ORACLE就会去找这条记录在查询被提交时的版本,得到的结果是当时没有这条记录,ORACLE就不认为它是查询结果中的记录,于是跳过,再去找下一条记录。
  从上面的处理过程可以看出,SQL server遇到这段代码,会不停循环下去--如果表的记录数不是限制的话,而ORACLE会把表的记录复制一次插入就推出。
  ORACLE对所有的数据都记录了它任何时间的状态,这样做当然会使数据占用更大的空间,但也使得查询得出的数据全部都是同一刻状态的数据。
  举个例子,如果对于一个银行的数据库系统,保存有储户的帐号和储蓄金额,假设在经理查询本行所有帐户的总储蓄额(假设数据量较大,需要花费的查询时间较长)时,有用户做了转帐处理,就可能出现以下情况:
  用户    金额
  A       1400
  B       2200
  C       600
  经理在使用sum统计总金额且没有使用锁定,如果已经统计完A和B的金额相加之后,统计到C之前,用户A将自己帐户上的金额转了1000到C的帐户上,那么对于某些数据库系统就可能会出现总金额比实际要多出1000的情况,因为它们在统计到用户C的储蓄金额时,会将用户A转帐后C的金额当作有效值参与到查询中,这种结果显然是不正确的。
  而ORACLE在处理到用户C的记录时会去找查询提交时间所对应的版本的记录,也就是A转帐到C之前的记录,显然这才是经理要得到的结果。
  由此看来,ORACLE的多版本,使得在不需要锁定的情况下,查询到的数据是同一时间的数据。
  这是不是意味着针对ORACLE数据库开发的查询就完全不需要锁来阻塞其他用户了呢?不是的
  以餐馆的订桌系统为例,假设用户通过查询来查看各个时间桌子是否被订了,然后再从没有被订的桌子中预定订某个时间某个桌子的使用权。
  如果这个系统是多用户的,那么就可能出现这种情况:甲乙两个用户同时查看当天下午五点的订桌情况,然后同时订下了1号桌。在没有对其它用户进行排它阻塞的情况下,两个用户同时看到1号桌没有被订,于是都下了订单,于是一张桌子同时被两人订了,这显然出了问题。
  正确解决这个问题,显然还是要使用用户阻塞的,也就是在查询时使用for update,这样在甲用户查询时,乙用户的查询就会被挂起,直到甲用户释放锁定之后才会执行,就不会出现上面这种情况了。
  ORACLE的多版本解决了数据的一致性问题,可以在不加锁的情况下获得同一时间的数据,然而这不意味着不需要在读取表的时候加锁了,类似上面的这种问题,往往很容易被忽略,而且这种bug很不容易找出来,何时用锁,何时不用,应当仔细。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动点名系统c语言,用C语言编写一个随机点名系统

/*编写一个随机点名系统,运行该系统后,按空格键可以显示出一名同学,以前被选中的同学,将不会再次被选中*/#include /*standard input & output*/#include /*standard libary*/#include /*string*/#include /*Console Input/Ou…

2017年全球AI芯片公司大盘点

来源:芯师爷概要:2017年,我们被AI公司的融资信息一次次刷屏,从2千万到1亿美金,让我惊诧道,AI的黄金年代真的来了吗?2017年,我们被AI公司的融资信息一次次刷屏,从2千万到1…

Oracle常用sql操作总结

一、选择行 1. 简单的SELECT 语句 SELECT 字段名1 [AS] 字段名1 解释 FROM table; 2. 处理NULL NVL函数可把NULL转换成其它类型的符号 编程技巧: NVL函数在多条件模糊查询的时候比较有用 NVL函数可返回多种数据类型: 返回日期 NVL(start_date,2002-02-01) 返回字符串 NVL(title…

51单片机 驱动步进电机 C语言 lcd,51单片机红外遥控控制步进电机的LCD显示源程序...

/******************************************************************************** 实验名 : 红外控制步进电机1602显示值实验* 使用的IO : 电机用P2口* 实验效果 : LCD1602显示出读取到的红外线的值,步进电机作出…

邬贺铨:工业物联网的技术与前景

来源:走向智能论坛概要:工业物联网是企业信息化的进程,我们经历了流程电子化、管理数字化、生产自动化到企业互联网化和企业智能化。邬贺铨:工业物联网靠花钱是买不到的!12月20日,2017第八届中国物联网产业…

约瑟夫问题C语言加注释,用链表实现约瑟夫环【有注释,有很多注释】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼主要问题在于删除约瑟夫环的数,结果一直出不来,看了好几天改了好几次都改不对#include #include typedef struct ysf{int num;struct ysf*next;}YSF;YSF*creat(int aa[]){int i;YSF *headNULL,*p1NULL,*p2NULL;headp1p2(YSF*)mallo…

Windows平台下GO语言编译器(GO-windows)

go for windows下载:http://code.google.com/p/go-windows/ ,http://savechina.download.csdn.net/使用前需要dos执行set GOROOT<the go folder>set GOOSmingwset GOARCH386set PATH<the go folder>/bin编译执行test.go文件需要执行8g test.go //编译生成test.88l …

30亿美金投入!一文读懂英伟达性能凶残的Tesla V100牛在哪?

来源&#xff1a;智东西概要&#xff1a;AI已无处不在&#xff0c;两股力量正推动计算机领域的未来。GTC CHINA 2017大会上&#xff0c;英伟达创始人兼CEO黄仁勋表示&#xff0c;AI已无处不在&#xff0c;两股力量正推动计算机领域的未来。第一、摩尔定律已终结&#xff0c;设计…

WPF Border

在 WPF 中&#xff0c;Border 是一种常用的控件&#xff0c;用于给其他控件提供边框和背景效果。 要使用 Border 控件&#xff0c;您可以在 XAML 代码中添加以下代码&#xff1a; <Border BorderBrush"Black" BorderThickness"2" Background"Lig…

C语言的数组基础,C语言基础-数组

一、数组(一维数组)什么是数组&#xff1f;数组是一组有序的、类型相同的数据的集合数组的作用&#xff1f;处理一些类型相同的数据集合数组的构成&#xff1a;元素、下标或索引、数组名定义&#xff1a;使用前必须定义1、存储类型2、数据类型3、数组名4、数组大小语法&#xf…

Go语言,在Ubuntu9.10和Windows安装

工作环境&#xff1a;Ubuntu9.10A、安装C语言工具Go的工具链采用C语言编写&#xff0c;构建需要安装以下开发工具&#xff1a;GCC,C语言标准库,the parser generator Bison,make,awk, 和ed &#xff08;编辑器&#xff09;.对于 OS X 系统&#xff0c;以上工具是Xcode的一部分。…

世界类脑AI巨系统研究综述,论ET大脑是不是全球首个类脑架构AI

前言&#xff1a;2017年12月20日阿里云云栖大会提出ET大脑&#xff0c;并宣称为全球首个类脑架构AI&#xff0c;本文详细介绍了类脑AI系统的理论研究和发展现状&#xff0c;分析了ET大脑理论的沿袭与借鉴。并指出企业为提升影响里推动新概念新理论无可厚非&#xff0c;但涉及到…

n元n次方程求解c 语言,解n元一次方程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼解N元一次方程从文件读入整数 N, 然后读入N*( N1)矩阵&#xff0c;得到解并输出到文件中。int main(){int ch;printf("\n");printf(" Gaussian Matrix Cal \n");printf("\n");printf("Choose:…

我为什么喜欢Go语言

来源&#xff1a;http://www.cnblogs.com/AllenDang/archive/2012/03/03/2378534.html 从2000年至今&#xff0c;也写了11年代码了&#xff0c;期间用过VB、Delphi、C#、C、Ruby、Python&#xff0c;一直在寻找一门符合自己心意和理念的语言。我很在意写代码时的手感和执行的效…

Netflix 官方技术博客:个性化分发与推荐,走在前列的 Netflix 是怎么做的?

来源&#xff1a;36氪概要&#xff1a;对于个性化分发与推荐&#xff0c;Netflix都是一个走在前面的公司。其首页的个性化推荐策略不断被后来者所模仿。对于个性化分发与推荐&#xff0c;Netflix都是一个走在前面的公司。其首页的个性化推荐策略不断被后来者所模仿。近日&#…

android主要文件的作用是什么,androidmanifest.xml文件的作用是什么

androidmanifest.xml文件的作用&#xff1a;1、是每个android程序中必须的文件&#xff0c;它位于整个项目的根目录&#xff1b;2、配置程序运行所必要的组件&#xff0c;权限&#xff0c;以及一些相关信息&#xff1b;3、是整个应用的入口&#xff0c;所以有助于更加深入的理解…

盘点丨2017年亚洲新晋18家独角兽公司

来源&#xff1a;网易科技概要&#xff1a;在投资领域&#xff0c;当一个创业公司估值达到10亿美元时&#xff0c;人们就称它加入了独角兽俱乐部。在投资领域&#xff0c;当一个创业公司估值达到10亿美元时&#xff0c;人们就称它加入了独角兽俱乐部。据国外媒体Tech in Asia报…

LiteIDE 编写Go的单元测试

第一步&#xff1a;新建一个 package "even" 第二步&#xff1a;编写代码 // even project even.go package evenfunc Even(i int)bool{return i%20 }func odd(i int)bool{return i%21 }第三步&#xff1a;在包 even 下新建测试文件 even_test.go第四步&#xff1a;…

揭秘Facebook SLAM技术,如何为人们生活增添奇幻的艺术色彩?

来源&#xff1a;将门创投概要&#xff1a;随着现代智能手机技术的发展&#xff0c;几乎所有的手机都配备了摄像头、陀螺仪和加速度传感器&#xff0c;硬件的进步帮助SLAM技术得到更广泛的传播和应用。 在过去的一年里&#xff0c;虚拟现实技术(Virtual Reality&#xff0c;简称…

android系统签名app自动更新,【Android 进阶】Apk 使用系统签名

刚入职的时候&#xff0c;固件中 app 需要在源码中编译&#xff0c;不是很理解&#xff0c;为什么不使用 IDE 编译&#xff0c;然后 copy 到 /system/app/*,咨询导师&#xff0c;得到反馈 app 需要使用系统的权限 在 AndroidManifest.xml 中声明了系统全下申明了系统权限androi…