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步操作都需要记录日志。

posted @ 2018-01-21 23:37  jw-young  阅读(560)  评论(0编辑  收藏  举报