zoukankan      html  css  js  c++  java
  • update语句的执行步骤及commit语句的执行顺序

    update语句的执行步骤和其他DML语句的执行步骤是一样的包含insert 、delete语句等,执行步骤如下:

    一、如果数据和回滚数据不在数据库高速缓存区中,则oracle服务器进程将把他们从数据文件中读取到数据库高速缓存区中。

    二、oracle服务器进程在要修改的数据行上加锁(行一级的锁)

    三、oracle服务器进程将数据的变化信息和回滚段所需要的信息都记录在重做日志缓冲区中

    四、oracle服务器进程将回滚所需的原始值和对数据所做的修改都写入数据库高速缓冲区。之后在数据库高速缓存区中所有的这些数据块都将被标记为脏缓冲区,因为此时内外存的数据是不一致的。

    五、然后由DBWR后台进程负责将数据库高速缓存区中的脏缓存区中的数据写到数据文件中,实现内外存的数据一致。至于DBWR后台进程的执行时间点是有oracle系统的设置所决定的,包含在一下情况时触发DBWR进程执行数据的写入。

       (1)缓冲区的数量超过了所设定的限额

       (2)所设定的时间间隔已到

       (3)当有进程需要高速缓存区,但是此时又没有空闲的高速缓存区时。

       (4)当校验点发生时

       (5)当某个表被删除drop或者被截断truncate时

       (6)当某个表空间被设置为只读状态时

       (7)当使用类似alter tablespace users begin backup的命令对表空间进行联机备份时

       (8)当某个临时表空间被设置为只脱机状态或正常状态时

    commit语句的执行顺序:

    一、服务器进程将提交的记录连同产生的SCN码一起写到重做日志缓存区中

    二、LGWR进程将把重做日志缓存区中一直到所提交的记录的所有记录连续的写到重做日志文件中。在此之后,oracle服务器就可以保证即使在系统崩溃的情况下所有提交的数据也可以得到恢复

    三、oracle通知用户进程提交操作已经完成

    四、服务器进程将修改数据库高速缓存区中的相关数据的状态并释放资源和打开锁(实际上就是修改数据库高速缓存区中的脏缓存区)

    此时这些数据可能并没有写入数据文件中,这些数据缓存区被标记为脏缓存区。高速缓存区中 的数据由DBWR进程写入数据文件中。

    LGWR进程在下列情况下将重做日志缓存区中的数据写入重做日志文件:

    (1)当某个事务被提交时

    (2)当重做日志缓存区中的变化的记录超过1M时

    (3)当缓存区的容量超过1/3时

    (4)在DBWR进程将数据库高速缓存去中修改过的数据块写入数据文件之前

    (5)每3秒钟

    注:从LGWR进程的触发事件看,LGWR进程的执行一定在DBWR进程的执行之前,这样才能保证数据恢复的完整性。

  • 相关阅读:
    谷歌浏览器调试按钮作用
    Android App罕见错误和优化方案
    cordova插件iOS平台实战开发注意点
    xcode8继续愉快的使用插件
    答CsdnBlogger问-关于VR取代安卓的问题
    答CsdnBlogger问-关于职业发展和团队管理问题
    答CsdnBlogger问-关于安卓入行和开发问题
    答CsdnBlogger问-关于定时和后台服务问题
    下载大图的demo by apple,值得研究和参考
    一个不错的mac软件下载站,mark一下 (商业使用请务必支持正版)
  • 原文地址:https://www.cnblogs.com/moonfans/p/3802371.html
Copyright © 2011-2022 走看看