oracle中,一个delete操作的流程删除(delete)1.oracle读block到buffer cache(如果该block在buffer中不存在)2.在redo log buffer中
oracle中,一个delete操作的流程
删除(delete)
1.oracle读block到buffer cache(如果该block在buffer中不存在)
2.在redo log buffer中记录delete操作的细节
3.在相应回滚段段头的事务表中创建一个undo条目
4.把将要删除的记录创建前镜像,存放到undo block中
5.在buffer cache中的相应数据块上删除记录,并且标记相应的数据块为dirty
提交(commit)
1.oracle产生一个scn
2.在回滚段事务表中标记该事务状态为commited
3.lgwr flush log buffer到日志文件
3.如果此时数据块仍然在buffer cache中,那么scn将被记录到block header上,这被称为快速提交(fast commit)
4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交scn并写回到block header上。这被称为延迟块清除(delayed block cleanout)。
oracle中,一个update操作的流程
1.用户提交一个update语句
2.serverprocess检查内存缓存
i 如果没有有效内存空间,启动dbwr,将缓存中未写入磁盘的脏数据块写入
ii 如果有有效空间,,从磁盘读入数据
3.在缓存内更新数据
i 申请一个回滚段入口,将旧数据写入回滚段
ii 加锁更新数据
iii 并同时将修改记录在redo log buffer 中
4.用户提交一个commit
i scn增加
ii 将redo log buffer 写入redo log file
iii 告诉用户 commit完成
oracle中,一个insert操作的流程
1.向db buffer申请内存空间。
2.产生redo.undo记录(undo产生redo信息),索引段redo信息,在undo里面记录相关数据行号。
3.commit
scn增加
将redo log buffer 写入redo log file
启动dbwr,将缓存中的数据写入磁盘的脏数据块写入
告诉用户 commit完成。
delete产生的undo信息是最多的(记录所有相关字段的值)。
update产生的undo信息在中间的(记录要更新的字段的值)。
insert 产生的undo信息是最少的(记录要插入的记录行号)。