什么是回滚和撤销
事务使用回滚段来记录变化前的数据或者撤销信息。假如执行下述的命令:
UPDATE EMP SET SAL=SAL*1.5 WHERE EMPNO=7782; |
这个语句怎样被执行?
1、 检查EMPNO=7782记录在Buffer Cache中是否存在,如果不存在则读取到Buffer Cache中
2、 在回滚表空间的相应回滚段事务表上分配事务槽,这个操作需要记录REDO信息。
3、 从回滚段读入或者在BUFFER CACHE中创建SAL=3000的前镜像,这需要产生REDO信息并记入REDO LOG BUFFER
4、 修改SAL=SAL*1.5,这是UPDATE的数据变更,需要记入REDO LOG BUFFER
5、 当用户提交时,会在REDO LOG BUFFER记录提交信息,并在回滚段标记该事务为非激活(INACTIVE)。
注意到在一个事务的进行过程中,REDO 和UNDO是交替出现的,而且对于数据库来说都是非常重要的。
回滚段存储的内容
Redo中只会记录少量信息,这些信息足以重演事务;同样Undo中也只记录精简的信息,这些信息足以撤销事务。
l 对于Insert操作,回滚段只需要记录插入记录的rowid,如果回滚,只需要将该记录根据rowid删除即可。
l 对于Update操作,回滚段只需要记录被更新字段的旧值即可(前镜像)