回滚的研究

来源:互联网 发布:linux docker网络 编辑:程序博客网 时间:2024/05/01 09:01

update t set id=1 where id=2


1.想更新ID=2的记录首先需要查到ID=2的 记录,检查ID=1是否在数据缓存区里,不存在则从磁盘中读取到数据缓存区中,这一点和普通到查询语句类似。

2.在回滚表空间到相应回滚段事务表上分配事务槽,从而在回滚表空间分配到空间,该动作需要记录日志写进日志缓存区。

3.在数据缓存区中创建ID=2的前镜像,前镜像数据也会写进磁盘的数据文件里(回滚表空间的数据文件),从缓存写进磁盘由ckpt决定,这些动作都会记录日志,并将其写进日志缓存区,lgwr将日志缓存区的数据写进日志文件形成redo文件

4.前面步骤做好了,才允许将ID=2的记录修改为ID=1,这个显然也是要记录到日志缓存区到

5.此时用户如果执行了提交,日志缓存区立即要记录这个提交到信息,然后就把回滚段事务标记为非激活inactive状态,表示允许重写。

6.如果执行了回滚,oracle需要从回滚段中将前镜像ID=2到数据读出来,修改数据缓存区,完成回滚。这个过程依然要产生日志,要写进 日志缓存区。

0 0
原创粉丝点击