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