ORA-1555通常是一个偶然出现的错误。有时在发生了该错误以后,重新运行该任务就有可能不再碰到类似的错误。这个错误最麻烦的是它并不会立刻发生,运行时间长的任务在错误失败以前可能已经运行了一段时间了(可能几个小时)。只是简单地重新运行该任务并不能保证它能成功,可能在运行了一段时间以后仍然失败。

  1 原因分析

  ORA-1555错的根本原因是因为oracle要保证读一致性。读一致性是指当有多个用户对一个数据块内的行进行修改时,这些块变“脏”或处于变化之中直到被确认。在被确认以前,它们对事务中的所有语句都是可见的,但是对别的事务或语句而言是不可见的。一旦确认以后,对所有后继的事务或语句就都是可见的了。但在事务被确认前的语句不能看到修改,因为这些修改还未发生。

  例如,事务T 1(如对某大表的exp操作)在2 2 :0 0开始而事务T 2(如对同一大表的update操作)在2 2 :0 1时开始,因为T 1需遍历一个很大的表,其读取要花很长的时间,而T 2可能对同一个表中的数据进行基于索引的更新操作。这样, T2可能在几秒钟之内完成,而T 1可能要运行很长时间,假定4 0分钟。当T 1到达T 2做过修改的地方时(根据当前的S C N时间戳可以识别出新作的改变),尽管T 2所进行的写已经被确认,但为了保证读一致性,它不会读到修改后的数据,它只访问在2 2 :0 0时的数据,在2 2 :0 1时所做的改变不能被读取 。T 1从回滚段中读取改变前的数据以保证读一致性。但因为事务T2已经提交,T2事务使用的回滚段oracle认为已经可以重新利用,当回滚段太少或事务较密集时,oracle有可能会用新事务覆盖掉原来T2事务的回滚段,这时T1事务读到被T2修改过的数据时,再从回滚段中就无法找到修改前的数据,这时就会报ORA-1555,snapshot too old错。

  下面我们可以结合实例来将此过程回溯一遍:

  (1)事务T1在22点开始执行了对某一个大表Test1的exp操作(Test1表数据量可能有几千万甚至更多),那么按照经验,此操作可能需要执行40分钟左右或更长;

  (2)事务T2在22点01分开始执行对Test1表某行的update操作,并且操作条件上有索引(将col1为00的行,col2值由90修改为100),故此操作很快完成,比如5秒钟完成操作并commit;

  (3)此时事务T2已经执行完毕,而事务T1还在执行中;

  (4)当事务T1需要将col1为00的行导出为dmp文件时,Oracle为了保证读一致性,即T1导出的必须是22点时数据库表的值,故col1为00的行对于T1任务来说值仍然为90,而非100;

  (5)由于T2事务在22点02分前就已经做完(提交),并且T2认为回滚段是可以重新利用的;

  (6)如果此时由于回滚段太少或业务量较密集,oracle就可能会重新利用刚才T2事务所使用的回滚段。这时T1事务读到此处时,就会造成无法找到回滚段中修改前的数据,产生错误。

读一致性也是数据库一致性的一个重要方面,在实际中,我们会遇到这种情况:我们对一个表中的某些数据进行了更新操作,但是还没有进行提交,这时另外一个用户读取表中数据。这个时候就出现了读一致性的问题:到底是读什么时候的数据呢?是更新前的还是更新后的?在DBMS中设有临时表,它用来保存修改前的值,在没有进行提交前读取数据,会读取临时表中的数据,这样一来就保证了数据是一致的。(当前修改数据的用户在同一事务中看到的是更新后的值)
但是还有一种情况:用户user1对表进行了更新操作,用户user2在user1还没有进行提交前读表中数据,而且是大批量的读取(打个比方:耗时3分钟)而在这3分钟内user1进行了提交操作,那又会产生什么影响呢?这个时候怎么保证读写一致性呢?这个时候DBMS就要保证有足够大的临时表来存放修改前的数值,以保证user2读取的数据是修改前的一致数据。然后下次再读取时候就是更新后的数据了。

所以说:数据库的一致性的前提是首先要保证事务的一致性。事务的一致性则需要通过并发控制、锁、隔离性等限制进行保证,具体工作机制可以参见前文,这里就不再研究了。

读完整性,撤销记录,事务
为了维护多版本数据一致性模型,当一个表的数据被更新(写)的同时也在被查询(读)时,Oracle必须创建一个维持读完整性的数据集。当更新发生时,被更新数据的原始值被记录在数据库的undo records中。在事务中的更新操作没有被提交之前,用户查询正在被修改的记录时只能看到她们的原始值。Oracle结合SGA中以及撤销记录中的信息为查询表数据的用户构建了一个 维持读完整性的视图[此视图非彼视图]。

当事务提交后,事务中对数据的修改才被永久记录。在用户事务提交后执行的语句就只能查询到提交后的数据了。

事务是Oracle实现读完整性的关键。事务是一组SQL语句(这组语句或者被一起提交,或者都不被提交),事务的作用是:决定了为查询用户生成的保持读完整性的视图的起始点 ,控制着被一个事务修改过的数据何时可以被数据库中其它进行读写操作的事务看到

ORA-1555,oracle读一致性相关推荐

  1. oracle事务之oracle读一致性

    http://blog.csdn.net/dba_waterbin/article/details/7651208

  2. oracle模拟重叠事务,ORACLE的事务读一致性与语句读一致性

    SET TRANSACTION READ ONLY来实现事物级别的一致性.一个事物所有语句读到的数据都是一致的. 我们开始试验一,模拟语句级别读一致性.第一个session使用显示打开一个游标模拟数据 ...

  3. Oracle 物理读 逻辑读 一致性读 当前模式读总结浅析

    Oracle 物理读 逻辑读 一致性读 当前模式读总结浅析 在ORACLE数据库中有物理读(Physical Reads).逻辑读(Logical Reads).一致性读(Consistant Get ...

  4. 2019DTCC大会分享:分布式数据库全局读一致性

    作者简介:李海翔,网名"那海蓝蓝",腾讯金融云数据库技术专家.中国人民大学信息学院工程硕士企业导师.著有<数据库事务处理的艺术:事务管理和并发访问控制>.<数据库 ...

  5. 关于oracle怎么保证读一致性

    假设这样一种情况,一个大查询开始FTS查询大表 ,然后另外一个session更新了表末尾的某条数据并提交,更新了N次 ,由于多次事务的DML使得该block上的相关XID和LOCK信息早已荡然无存 , ...

  6. oracle consistent gets,oracle构建一致性读

    对于实际的业务系统,通常有一些热点的表,insert和delete的量非常大,这个时候就会发现一些查询语句的逻辑读比较偏高, 这时可能就是oracle在构建一致性块的进行的consistent rea ...

  7. Oracle数据库一致性读的原理

    在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(Instance Recovery) ...

  8. 转:Oracle数据库一致性读的原理(Consistent Read)

    申明:此文为转载,如果发生版权问题,本人将立即删除相关内容: http://blog.csdn.net/wh62592855/article/details/6151482 在Oracle数据库中,u ...

  9. ORACLE 多版本读一致性

    先来看看这段代码:   while s in (select * from table1) loop     insert into table1 values(s.field1,s.field2,s ...

最新文章

  1. WebSocket 中的Netty
  2. vue 项目引用static目录资源_vuejs-templates静态资源目录src/assets、和static/区别
  3. 各大网站CSS代码初始化集合
  4. atcoder E - Greedy Ant(最优解等价+dp)
  5. Rhino学习教程——1.5
  6. kvm 调试内核方法
  7. linux ftp安装_Linux 文件共享方案
  8. facade层,service 层,domain层,dao 层设计
  9. erp oracle mrp,OracleERP用戶手册-MRP.doc
  10. UmiJS介绍--路由(三)
  11. EXCEL复制可见单元格
  12. 计算机游戏动漫制作自我鉴定,关于游戏实习的自我鉴定
  13. Jetpack Room
  14. iOS开发之高仿斗鱼tv初探
  15. 积分商城系统业务逻辑思维导图_怎么开发积分商城系统_OctShop
  16. 网页中的动漫人物互动——看板娘
  17. linux 命令行退出某条命令
  18. IT男真实的情感记录
  19. c语言中结构体变量怎么初始化为0,C语言高级编程:数组和结构体初始化为0的方法...
  20. java sound 混音_iOS音频编程之混音

热门文章

  1. WinForm登陆成功后跳转到主窗口
  2. Excel按照单元格内设定好的次序进行工作表排序
  3. 最佳阵容 | Flutter Firebase 插件更新
  4. 限流的抖音号怎么养?养号方法是什么?
  5. STM32+ESP8266+MQTT连接阿里云服务器(四、STM32连接阿里云平台)
  6. 中小型水库雨水情测报平台有哪些功能?水库雨水情数据孪生安全监测系统
  7. 面试了一位-46-岁的程序员,思绪万千,最后结局竟让我大惊失色
  8. 文件实时同步备份软件那个比较好用?
  9. 怎么删除电脑上的另一个用户名?删除电脑上多余的用户名
  10. (一)MQTT+阿里云实现设备>云,云>设备之间的通信。