Oracle 回滚和撤销
一、回滚
(ROLLBACK)和撤销(UNDO)
回滚和前滚是保证
Oracle 数据库中的数据处于一致性状态的重要手段。
在
9i 版本以前
Oracle 使用数据库中的回滚段来实现未提交数据或因系统故障导致实例崩溃时进行回滚操
作
每一个表空间需要创建回滚段,各个表空间对回滚段实现各自的管理
在
9i 及后续版本
提供了一种新的回滚数据的管理方式,即使用
Oracle 自动管理的撤销(Undo)表空间
自动撤销管理表空间统一管理所有
DML 的回滚操作,简化了对于回滚工作的管理
在
i,10g 中的回滚段仅仅用作保留向后兼容
撤销段代替了原有版本中的回滚段,因此本文所有描述均使用撤销
撤销的实质意味着将所作的修改退回到修改前的状态,即倒退所有
DML 语句
二、撤销段中的内容及相关特性
对于任何
DML 操作而言,必须同时处理数据块和撤销块,并且还会生成重做信息
在
ACID 中,A、C、I 要求生成撤销,D 则要求生成重做
INSERT:
撤销段记录插入记录的
rowid,如果需要撤销,则根据 rowid 将该记录删除即可
UPDATE:
撤销段记录被更新字段的原始值,撤销时将原始值覆盖新值即可
DELETE:
撤销段记录整行的数据,撤销时执行反向操作将该记录插入原表
由上可知,
UNDO 段中的内容总结如下:
数据为修改之前的副本
从每个改变数据的事务中获得
在事务结束前一直被保留
UNDO 段中数据的作用:
用于回滚操作
读一致性和闪回查询
用于事务失败时的恢复
UNDO 段与事务:
一个事物的启动,
Oracle 将为其分配仅仅一个 UNDO 段,若该段用完,则 Oracle 会自动为该
UNDO 段添加另一个区间(extent)
一个
UNDO 段能够同时为多个事务服务