在oracle中有三种数据,data、redo和undo。undo是oracle在undo段中记录的信息,用于取消或回滚事务。学习上要把重点放在undo的作用以及基本概念。
你对数据执行修改时,oracle会生成undo信息,以便回到更改前的状态。我们可以通过闪回事务历史读取undo。
undo在数据库内部存储在一组特殊的段中,称之为undo段。
rollback segment和undo segment一般认为是同义词。前者使用手动undo管理,后者自动undo管理。他俩的意图和作用都一样。
通常对undo有一个误解,认为undo用于将数据物理地恢复到执行语句或事务之前的样子,但实际上并非如此。数据库只是逻辑地恢复到原来的样子,所有修改都被逻辑地取消,但是数据结构以及数据块本身在回滚后可能大相径庭。因为在多用户并发系统中,往往会有其他的事务在修改同一个块,如果简单地将一个块放回到我们事务开始前的样子,这样会撤销他者的工作。
通过如下实验可以阐述上面的观点:
1)创建一个空表
2)对它做一个全表扫描,观察读表所执行的I/O数量
3)在表中填入许多行(但没有提交)
4)回滚这个工作,并撤销
5)再次进行全表扫描,观察所执行的I/O数量
6)比较2)和5)的数量差
[注:本实验2),5)都要进行两次全表扫描,以减少优化器统计时所进行的I/O影响]
hr@ORCL> create table t as select * from all_objects where 1=0;
Table created.
hr@ORCL> select * from t;
no rows selected
hr@ORCL> set autotrace traceonly statistics
hr@ORCL> select * from t;
no rows selected
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
hr@ORCL> insert into t select * from all_objects;
49867 rows created.
hr@ORCL> set autotrace off
hr@ORCL> rollback;
Rollback complete.
hr@ORCL> select * from t;
no rows selected
hr@ORCL> set autotrace traceonly statistics
hr@ORCL> select * from t;
no rows selected
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
689 consistent gets
最初,这个查询需要3个I/O来完成这个表的全表扫描。前面的insert导致将一些块增加到表的高水位线之下,这些块并没有因为回滚而消失,它们还在那里,而且已经格式化,只不过现在为空。全表扫描必须读取这些块,看看其中是否包含行。
一方面,段确实由create创建(注:11gR2会有延迟段创建,即:由insert创建)但是未被rollback“撤销”;另一方面,由create新创建的格式化块被第二次扫描,这两方面结合在一起,说明回滚只是一种逻辑上“将数据库恢复原状态”的操作。数据库并不会完全恢复原状,只是逻辑上相同而已。
分享到:
相关推荐
- **私有性**:每个会话都有一个私有的Temporary Undo Segment,用于存储该会话所操作的临时表的Undo记录。 **2. Temporary Undo 的生命周期** - **生命周期**:Temporary Undo Segment 的生命周期与创建它的会话...
在开发Windows应用程序时,撤销/重做功能是一个重要的用户交互元素,它允许用户撤销或恢复他们的操作,提高用户体验。在C#中实现这样的框架可以帮助开发者更轻松地为各种编辑控件(如TextBox、RichTextBox、ComboBox...
每个操作被封装为一个命令对象,包含执行和反向执行(undo)的方法。这样可以将操作与调用它们的对象解耦,使得撤销和重做变得简单。 - **备忘录模式**:备忘录模式用于保存对象的状态,以便在需要时恢复。在"undo...
在IT行业中,“Undo”是一个非常基础且重要的概念,它广泛应用于各种软件和应用程序中,特别是在文本编辑器、图像处理软件以及编程环境中。这个功能允许用户撤销最近的操作,恢复到操作前的状态,极大地提高了工作...
此时,Oracle会在Buffer Cache中创建一个CR Block(Current Read Block),即通过克隆原始Block并应用相应的Undo信息来创建。这一过程可能会重复多次,直到找到满足条件的版本为止。如果所需Undo记录已不存在,则会...
- 通常建议至少有一个UNDO表空间,但可以根据并发事务的数量和规模来增加更多的UNDO表空间。 - 对于高并发的应用场景,可以考虑设置多个较小的UNDO表空间来提高性能。 - **UNDO表空间的监控**: - 应定期检查...
Undo表空间有其特殊性质,它只能与单个数据库实例关联,并且在同一时间,一个实例只能有一个当前可写的Undo表空间。这确保了数据的隔离性和安全性。Undo信息与重做日志(Redo Log)有所不同,Redo Log记录了如何重新...
当用户执行一个操作时,对应的命令被触发,执行相应的函数。 2. **撤销/重做管理器**:MFC提供了一个CCommandManager类来处理撤销/重做栈。这个类维护两个堆栈,一个用于保存undo操作,另一个用于保存redo操作。...
在Oracle数据库系统中,"undo表空间"是一个至关重要的组成部分,它主要负责存储事务的回滚(rollback)信息。本文将深入探讨undo表空间的概念、作用、管理以及常见问题的处理,帮助你全面理解并有效地解决数据库undo...
在Oracle数据库系统中,"重做undo表空间"是一个至关重要的概念,它是数据库事务处理的基础。Undo表空间是用来存储事务撤销操作时所需信息的地方,这些信息被称为重做日志(Redo Log)。当一个事务对数据进行修改时,...
MVCC(多版本并发控制)机制是数据库事务隔离级别中的一个重要概念,它能够实现事务的并发访问控制,避免了传统锁机制带来的性能瓶颈。MVCC主要依赖于undo log(撤销日志)和版本链来实现非锁定的读-写一致性。下面...
undo 块的重用规则首先在 undo 表空间中找 seq 最大的一个区,然后在这个区中找 seq 值低于其他 undo 块的块,然后可以重用。如果一区中有事务或是有未超过 undo_retention 的块,那么这个区是不能被覆盖的,只能...
本地UNDO模式是Oracle 12C R2的一个重要特性,它通过为每个PDB提供独立的UNDO表空间,不仅减少了资源争用,还支持了一系列高级功能。掌握本地UNDO模式的使用方法,可以帮助DBA更好地管理数据库性能和资源,从而提升...
首先,`QUndoStack`是Qt的一个类,它是`QStack*>`的子类,专门用来存储一系列可以撤销的命令对象。`QUndoCommand`是撤销/重做操作的基本单位,它封装了对数据的操作以及如何撤销这些操作。创建自定义的`QUndoCommand...
当一个事务执行时,如果发生回滚或者在查询过程中需要查看事务开始前的数据状态,撤销段就会提供这些信息。 在达梦数据库中,修改UNDO_RETENTION参数主要是为了平衡数据库的性能和空间利用率。过短的UNDO_RETENTION...
通过定义基础类 `CEditRecord` 来记录每个操作,并使用控制类 `CRecordCtrl` 来管理和执行Undo/Redo操作,我们可以构建出一个高效且易于扩展的Undo/Redo机制。这对于提高用户体验和软件质量具有重要意义。
这篇实验主要探讨了如何在Windows Forms(WinForm)应用中实现一个简单的Undo和Redo系统,同时支持设置最大撤销次数。 首先,我们需要理解撤销和重做是如何工作的。撤销操作通常是通过记录用户进行的每一项改变来...
UNDO是为了撤销你做的操作,例如你执行了一个TRANSACTION,但是执行失败了或你自己后悔了,则需要使用ROLLBACK命令回退到操作之前。ROLLBACK是在逻辑层面实现的,而不是物理层面,因为在一个多用户系统中,数据结构...
在图像编辑软件中,撤销(Undo)功能是用户体验的关键组成部分,它允许用户在操作失误时回退到前一个状态,从而避免了永久性错误或不必要的重新工作。在给定的文件信息中,虽然代码片段主要关注于框架类CChildFrame...
3. **Undo和Redo管理器(Undo/Redo Manager)**:这是一个负责处理撤销和重做逻辑的类,它管理操作栈,处理用户的Undo和Redo请求。 4. **事件处理(Event Handling)**:在Delphi中,事件通常与控件关联,当用户...