zoukankan      html  css  js  c++  java
  • Oracle dml开始到commit期间的流程

    Oracle dml开始到commit期间的流程


    1.确认需要的数据块,先去db buffer cache里找,没有的去磁盘上找,找到的数据复制到buffer cache里
    2.申请undo,把待修改的block的镜像写入到undo里
    3.在DML操作影响的所有记录和索引键上放置排他锁(防止其他会话对相同记录的变化操作),在包含这些记录的表上放置共享锁(保证在DML期间,表的结构不会变化)
    4.写redo到redo log buffer,redo信息包括变化前的旧值、变化后的新值,如果存在关联索引,则还包括索引的旧值以及新值
    5.加锁、更新数据块(此时开始至COMMIT为止,其他会话关于该值的查询,该值索引的查询将被定位到undo里)
    6.接收commit
    7.server process把该事务的信息(SCN号等)写到redo log buffer
    9.LGWR将redo log buffer的内容写入磁盘,加在表和行上的锁被释放
    10.undo标记为commited

    总结:
    1.数据在commit之前就已经改完了  只是我们读取不到改完的数据 在commit之前我们读取的都是undo的数据 这也能说明为什么commit快 rollback慢
    2.写日志应该是在写数据之前(我认为的)
    3.如果事务未执行完实例crash了,那么在进行crash recovery的时候,smon会找最近一个checkpoint(checkpoint之前的操作都是确认落盘的),然后对checkpoint后的日志条目进行前滚(replay),如果前滚时没有找到事务结束的条目信息,那么就会去对该事务进行回滚


    LGWR是从redo log buffer写到redologfile, 为了减少写LOGFILE的IO,不是时时刻刻都在写redo buffer写到redo logfile,而是有触发条件的:
    a)1 meg of data appears in the log buffer: 当log buffer填满1M时触发LGWR
    b)every 3 seconds:每三秒触发一次
    c)when it is 1/3 full:当log buffer三分之一满时。
    d)upon commit:当执行提交的时候
    e)dbwr:当触发DBWR前,也就是数据写到数据文件之前
    ————————————————
    版权声明:本文为CSDN博主「jzzw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u014710633/article/details/89378596

  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/12812841.html
Copyright © 2011-2022 走看看