tom 的oracle 9i&10g编程艺术:深入数据库体系结构
中文版
P288假想场景:系统现在崩溃启动时,oralce会读取重做日志,发现针对这个事务的一些重做日志条目。给定系统的当前状态,利用
重做日志文件中对应的插入redo条目,并利用仍在缓冲区中对应的插入的redo信息,oracle 会“前滚”插入
。...  现在有一些undo块...我有两个疑问:1:并利用仍在缓冲区中对应的插入的redo信息-->这里的redo信息是不是从redo文件里读取出来的
             2:现在有一些undo块  -->这里的undo块是从哪里,是因为redo信息,导致重做,产生的undo信息吗
     因为是重启,所以肯定不是之前的操作产生
整个事件是:有一个插入语句,产生了些重做日志信息,其中有些日志已经输出到磁盘上,有些还在缓存中
这是假设因为故障,重启了电脑了,oracle 是怎么处理的

解决方案 »

  1.   

    最好说明一下具体的章节信息
    我有个中文版的PDF 288页是讲隔离级别的你上面那一段描述太简短了
    而且翻译的好像不太好
    我没看太明白什么意思
    呵呵 想帮你也有心无力呀
      

  2.   


    我的是实体书,中文版的
    第九章 redo 与undo 
    9.3节  redo 和undo如何协作 
    2 update  假想场景  系统现在崩溃
      

  3.   

    有INSERT 和UPDATE
    你想问的是哪一个
      

  4.   

    你前面好像是说插入
    现在变update了?
      

  5.   


    书上是说insert ,但实际是update 我想他们两个原理应该一样,你就说说简单点的insert 吧
      

  6.   

    其实是INSERT 完了紧接着一个UPDATE稍等 我正在看
      

  7.   

    有一个插入语句,产生了些重做日志信息,其中有些日志已经输出到磁盘上,有些还在缓存中 
    这是假设因为故障,重启了电脑了,oracle 是怎么处理的 
    举个例子吧 可能不是特别严谨 不过谨以此来说明一些处理的过程
    假设插入了1、2两行
    行1产生的redo在内存中
    行2产生的redo已经输出到磁盘上
    这个时候发生了故障……
    下次ORACLE在启动的时候 系统会自动进行instance recovery
    由于行1的redo在内存中 还没来得及输出到磁盘上 所以系统就当它从来没有发生过
    行2产生的redo 已经写到磁盘上了 
    这个时候ORACLE会redo这个操作
    在这个重做的过程中会产生两部分内容
    一部分就是修改过的数据块 还有一部分就是这个修改所产生的undo(redo也是会产生undo的)
    接下来ORACLE发现你这个事务并没有commit
    所以就用前面产生的undo来回滚这条插入所以 最终的结果就是行1和行2都不存在