1.Commit(提交)
作为一名开发人员,你应该深入了解COMMIT期间会做些什么。COMMIT通常是一个非常快的操作,而不论事务大小如何。
你可能认为,一个事务越大(换句话说,它影响的数据越多),COMMIT需要的时间就越长。不是这样的。不论事务有多大,COMMIT的响应时间一般都很“平”(flat,可以理解为无高低变化)。这是因为COMMIT并没有太多的工作去做,不过它所做的确实至关重要。
有些人认为限制事务的大小,一块一块地提交要比一次性提交要节省系统资源,其实 频繁的进行事务提交比一次性提交效率要低。我们已经知道,如果不使用绑定变量,而且频繁地完成硬解析,这会严重地降低并发性,原因是存在库缓存竞争和过量的CPU占用。即使转而使用绑定变量,如果过于频繁地软解析,也会带来大量的开销。COMMIT就是这样的一种操作(需要进行软解析),最好根据业务需求来确定事务的大小,而不是错误地为了减少数据库上的资源使用而“压缩”事务。
那么,为什么COMMIT的响应时间相当“平”,而不论事务大小呢?在数据库中执行COMMIT之前,困难的工作都已经做了。我们已经修改了数据库中的数据,所以99.9%的工作都已经完成。例如,已经发生了以下操作:
a. 已经在SGA中生成了undo块。
b. 已经在SGA中生成了已修改数据块。
c. 已经在SGA中生成了对于前两项的缓存redo。
d. 取决于前三项的大小,以及这些工作花费的时间,前面的每个数据(或某些数据)可能已经刷新输出到磁盘。(比如redo信息会每隔3S刷新输出一次)
e. 已经得到了所需的全部锁。
执行COMMIT时,余下的工作只是:
a. 为事务生成一个SCN。如果你还不熟悉SCN,起码要知道,SCN是Oracle使用的一种简单的计时机制,用于保证事务的顺序,并支持失败恢复。SCN还用于保证数据库中的读一致性和检查点。可以把SCN看作一个钟摆,每次有人COMMIT时,SCN都会增1.
b. LGWR将所有余下的缓存重做日志条目写到磁盘,并把SCN记录到在线重做日志文件中。这一步就是真正的COMMIT。如果出现了这一步,即已经提交。事务条目会从V$TRANSACTION中“删除”,这说明我们已经提交。
c. V$LOCK中记录着我们的会话持有的锁,这些所都将被释放,而排队等待这些锁的每一个人都会被唤醒,可以继续完成他们的工作。
d. 如果事务修改的某些块还在缓冲区缓存中,则会以一种快速的模式访问并“清理”。块清除(Block cleanout)是指清除存储在数据库块首部的与锁相关的信息。实质上讲,我们在清除块上的事务信息,这样下一个访问这个块的人就不用再这么做了。我们采用一种无需生成重做日志信息的方式来完成块清除,这样可以省去以后的大量工作.
可以看到,处理COMMIT所要做的工作很少。其中耗时最长的操作要算LGWR执行的活动(一般是这样),因为这些磁盘写是物理磁盘I/O。不过,这里LGWR花费的时间并不会太多,之所以能大幅减少这个操作的时间,原因是LGWR一直在以连续的方式刷新输出重做日志缓冲区的内容。在你工作期间,LGWR并非缓存这你做的所有工作;实际上,随着你的工作的进行,LGWR会在后台增量式地刷新输出重做日志缓冲区的内容。这样做是为了避免COMMIT等待很长时间来一次性刷新输出所有的redo。
2.Rollback
Rollback其实就是commit的逆操作,rollback主要做如下事情:
a. 撤销已做的所有修改。其完成方式如下:从undo段读回数据,然后实际上逆向执行前面所做的操作,并将undo条目标记为已用。如果先前插入了一行,ROLLBACK会将其删除。如果更新了一行,回滚就会取消更新。如果删除了一行,回滚将把它再次插入。
b. 会话持有的所有锁都将释放,如果有人在排队等待我们持有的锁,就会被唤醒。
与此不同,COMMIT只是将重做日志缓冲区中剩余的数据刷新到磁盘。与ROLLBACK相比,COMMIT完成的工作非常少。这里的关键是,除非不得已,否则不会希望回滚。回滚操作的开销很大,因为你花了大量的时间做工作,还要花大量的时间撤销这些工作。除非你有把握肯定会COMMIT你的工作,否则干脆什么也别做。听上去这好像是一个常识,这是当然的了,既然不想COMMIT,又何苦去做所有这些工作!不过,我经常看到这样一些情况:开发人员使用一个“真正”的表作为临时表,在其中填入数据,得到这个表的报告,如何回滚,并删除表中的临时数据。下一节我会讨论真正的临时表,以及如何避免这个问题。
分享到:
相关推荐
在Oracle数据库环境中,事务管理与存储过程的结合是实现数据一致性、事务回滚以及错误处理的关键技术之一。本文将深入探讨“Oracle事务回滚存储过程”这一主题,旨在理解其核心概念、工作原理以及实际应用。 ### ...
2. 事务恢复:当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,Oracle 将在下次打开数据库时利用回滚来恢复未提交的数据。 3. 读一致性:当一个会话正在修改数据时,其他的会话将看不到该会话...
在Java编程中,Oracle数据库是常用的后端存储系统,而事务处理和异常回滚是确保数据一致性、完整性和可靠性的关键机制。以下是对这个主题的详细讲解。 首先,Oracle JDBC驱动程序是Java与Oracle数据库之间通信的...
Oracle数据库中的回滚段(Rollback Segments)是存储事务历史的重要组件,它们记录了数据修改前的状态,以确保数据的完整性和一致性。在深入理解回滚段之前,我们需要先明确其基本概念和作用。 回滚段的主要功能...
### Oracle数据库回滚段专题解析 #### 回滚段概述 在Oracle数据库中,回滚段(Rollback ...通过深入理解Oracle数据库中的回滚段机制及其应用场景,DBA能够更好地管理和优化数据库性能,确保数据的安全性和一致性。
5. 提交或回滚事务后,Oracle会为该扩展分配新的扩展,并将其插入到回滚段的扩展环中。 6. 插入、更新和删除操作都会产生回滚信息。 7. 在回滚段中读取数据需要短暂的排他锁。 Oracle安装后,默认的回滚段是system...
在Oracle数据库系统中,回滚段(Rollback Segment)扮演着至关重要的角色,它们存储了事务处理(Transaction)的回滚信息,确保了数据读的一致性(read consistency)以及数据恢复(Database Recovery)的可能性。...
每个 Oracle 数据库实例都包含至少一个回滚段,不管事务是否被提交,被事务改变了的数据的旧值都将记录在回滚段中。回滚段的工作方式可以简单概括为自动扩展、循环分配。 二、回滚段常见故障分析 如果回滚段出现...
在Oracle数据库中,回滚段扮演着至关重要的角色,尤其是在确保事务处理的完整性和提供一致性视图方面。本文旨在深入探讨Oracle回滚段的相关知识,包括其作用、原理、分配与管理、诊断以及常见问题等内容。 #### 二...
### ORACLE回滚段的概念、用法和规划及问题解决 #### 一、回滚段的概念 在Oracle数据库中,**回滚段(Rollback Segment)**是一种特殊类型的段,用于存储事务处理过程中更改的数据的旧值。这些数据在事务处理期间...
通过上述内容,我们可以清楚地看到Oracle数据库中事务处理过程中涉及的关键组件:数据缓冲区、回滚段、重做日志以及这些组件之间的交互作用。这些机制共同确保了数据库的一致性、可靠性和高可用性。
2. **事务恢复**:如果在事务处理过程中发生例程失败,Oracle会在下次打开数据库时利用重做日志文件中的回滚段信息来恢复未提交的数据。 3. **读一致性**:回滚段确保了在并发环境中,不同的会话看到的数据是一致的...
读一致性错误通常是由于事务在执行过程中,试图读取已被其他事务修改但未提交的数据块,这时可以通过V$ROLLNAME、V$ROLLSTAT、V$TRANSACTIONS和V$SESSION等动态性能视图来查看事务和回滚段的信息。 在实际操作中,...
2. 事务恢复:如果在事务处理过程中出现异常,Oracle会在下次打开数据库时利用回滚段中的信息恢复未提交的数据。 3. 读一致性:确保不同事务之间不会看到未提交的修改,提供了一种在并发环境下保持数据一致性的机制...
### Oracle服务进程如何处理用户进程的请求 Oracle数据库系统中,...后续的任务还包括为事务建立回滚段、修改数据块、管理脏数据列表以及用户提交或回滚事务等,这些步骤共同构成了Oracle处理用户请求的完整流程。
总结来说,Oracle的回滚和重做机制是其事务处理能力的关键,它们保证了数据的准确性和一致性。回滚用于撤销未提交的事务修改,而重做则用于在系统故障后恢复数据。UNDO段和回滚段在这一过程中扮演了重要角色,提供了...
- SQL Server使用日志缓存和事务日志来处理事务的提交和回滚。 通过比较上述知识点,我们可以看出Oracle和SQL Server在事务处理上都有相似的目标和方法,旨在保证数据的一致性和可靠性。然而,它们在实现细节和...
### ORACLE数据库插入、修改、删除操作提交 ...总之,对ORACLE数据库的操作,特别是涉及到数据更改的操作,必须谨慎处理提交过程。这不仅能保证数据的一致性和完整性,还能提高系统的稳定性和效率。
总结来说,Oracle回滚段是确保数据一致性的重要机制,通过上述查询代码,我们可以有效地监控回滚段的使用情况,从而在大批量DML操作时预测和处理可能的回滚段资源紧张问题,提高系统的稳定性和效率。如果你在实际...