zoukankan      html  css  js  c++  java
  • Update语句-Oracle操作过程

    《收获,不止Oracle》读书笔记

    例如:update taccoinfo t set t.en_requestbala = 1001.00 where t.vc_tradeacco = '0047';

    1、先查询vc_tradeacco='0047'的记录,检查数据缓存区中是否存在,不存在则从磁盘文件中读取,并保存在缓存区中。

    2、在回滚表空间相应的回滚段事务表上分配事务槽,从而在回滚表空间中分配到空间,当然该操作也要记录日志。-----重点

    3、在数据缓存区中创建vc_tradeacco='0047'的前镜像,该镜像数据也会写进磁盘文件里(回滚表空间的数据文件),该动作

         由CKPT触发。---重点

    4、1,2,3点都做好了,才允许将vc_tradeacco='0047'的en_requestbala改为1001.00,注意是数据缓存区。

    5、此时如果用户提交了commit,像上一篇讲commit说的,LGWR会将更新日志从缓存区刷到磁盘文件,并把回滚段事务标记

    为非激活状态(INACTIVE),表示允许重写了。

    6、如果用户执行了回滚,Oracle就从回滚段中将前镜像vc_tradeacco='0047'对应的数据读出来,修改数据缓存区中的数据,完成回滚。

    ---我觉得回滚和commit一样,要把日志从缓存区刷到磁盘文件,否则如果断电的话,并且update日志已经刷到磁盘文件(根据LGWR进程运行规则之一"每隔3秒,LGWR运行一次"),而rollback日志没有,

    数据恢复的时候就有问题了,用户会看到未提交的update语句,回滚段事务槽为激活状态。

    以上2-6步操作都需要记录日志。

  • 相关阅读:
    python3.5 安装mysqlclient
    python mysqlclient安装失败 Command "python setup.py egg_info" failed with error code 1
    python mysqlclient安装失败 Command "python setup.py egg_info" failed with error code 1
    JUC-多线程锁
    JUC-线程间通信
    JUC-LOCK接口
    JUC-JUC是什么?
    Zookeeper
    Mac 安装IDEA 2018.3 版本
    MyISAM和innoDB
  • 原文地址:https://www.cnblogs.com/jingweiyoung/p/8326074.html
Copyright © 2011-2022 走看看