1 闪回事务(Flashback Transaction)
到目前为止,介绍的所有功能均不会直接将数据恢复为“以前”的样子。闪回查询只是查看,闪回数据归档只是延伸了闪回查询的时间窗口,闪回事务查询虽然提供了撤销SQL,但是否执行及如何执行还需要管理员进一步手动操作。
若是管理员决定撤销某个或某些事务,Oracle提供一个专门用来撤销事务的工具——闪回事务。
1.1 闪回事务概念概述
闪回事务又名撤销事务(Backout Transaction),能够撤销一个或多个事务的修改,其功能由一个名为DBMS_FLASHBACK.TRANSACTION_BACKOUT的存储过程实现。该存储过程的工作原理是自动分析重做日志,挖掘出变更前的值用以构建撤销SQL(Undo SQL),然后执行撤销SQL最后达到撤销事务的目的。
为使用该功能,至少需要事先启用主键补充日志。另外,为了能够跟踪外键依赖还需要启用外键补充日志。
闪回事务是利用存储过程dbms_flashback.transaction_backout 来回滚某个事务。其回退的原理是利用undo日志逻辑撤销事务的影响,并根据选项决定是否一并撤销依赖其的子事务。
1.2 事务的依赖性
在继续讨论此功能前,首先应了解一个概念:事务的依赖性。比如,两个事务TX1和TX2,符合以下3个条件的任意一个就可以认为TX2依赖TX1:
- WAW依赖(Write After Write):在TX1修改了表的某行之后,TX2又修改了同一行。
- 主键依赖:在一张拥有主键的表中TX1首先删除了一行,之后TX2又插入了具有相同主键值的另一行。
- 外建依赖:由于TX1的修改(insert或update)而产生了新的可被外键参考的字段值,之后TX2修改(insert或update)外键字段时利用了TX1所产生的字段值。
了解事务依赖性有助于解决在撤销事务时遇到的矛盾,以主键依赖为例,试想若直接将事务TX1撤销并且不理会事务TX2,岂不