4.2 事务管理概述

在 Oracle 中一个事务(transaction)开始于首个可执行的 SQL 语句(executable SQL statement)。可执行的 SQL 语句指产生了对实例(instance)的调用(call)的 SQL 语句,包括 DML 和 DDL 语句。
     当一个事务(transaction)开始时,Oracle 为此事务分配一个可用的撤销表空间(undo tablespace)来记录其产生的回滚条目(rollback entry)。
     一个事务(transaction)在满足以下条件之一时结束:
     1. 用户提交了 COMMIT 语句,或不包含 SAVEPOINT 子句的 ROLLBACK 语句。
     2. 用户执行了 CREATE,DROP,RENAME,或 ALTER 等 DDL 语句。如果当前事务中包含 DML 语句,那么 Oracle 首先提交(commit)此事务,然后将 DLL 语句作为一个只包含一条 SQL 语句的新事务运行并提交。
     3. 用户断开了与 Oracle 的连接。当前事务将被提交。
     4. 用户进程异常结束。则当前事务被回滚(roll back)。
     当一个事务(transaction)结束后,下一个可执行的 SQL 语句(executable SQL statement)将会自动地开始一个新事务。
     提示:应用程序在退出时应该显示地进行提交(commit)或回滚(roll back)操作。
4.2.1 事务提交
     提交(commit)一个事务(transaction)意味着将此事务中 SQL 语句对数据的修改永久地记录到数据库中。
     在一个修改了数据的事务(transaction)被提交之前,Oracle进行了以下操作:
     1. Oracle生成了撤销信息(undo information)。撤销信息包含了事务中各个 SQL 语句所修改的数据的原始值。
     2. Oracle在 SGA(系统内存区) 的重做日志缓冲区(redo log buffer)中生成了重做日志条目(redo log entry)。重做日志记录(redo log record)中包含了对数据块(data block)和回滚块(rollback block)所进行的修改操作。这些记录可能在事务提交之前被写入磁盘。
     3. 对数据的修改已经被写入 SGA 中的数据库缓冲区(database buffer)。这些修改可能在事务提交之前被写入磁盘。
     提示:已提交事务(committed transaction)中对数据的修改被存储在 SGA 的数据库缓冲区(database buffer)中,她们不一定立即被后台进程 DBWn 写入数据文件(datafile)内。Oracle将选择适当的时机进行写操作以保证系统的效率。因此写操作既可能发生在事务提交之前,也可能在提交之后。
     当事务(transaction)被提交之后,Oracle进行以下操作:
     1. 撤销表空间(undo tablespace)内部的事务表(transaction table)将记录此次提交(commit),Oracle为此事务分配一个唯一的系统变化编号(system change number,SCN),并将其记录在事务表中。
     2. 重做日志写进程(The log writer process,LGWR)将 SGA 内重做日志缓冲区(redo log buffer)中的重做日志条目(redo log entry)写入重做日志文件(redo log file)。同时还将此事务的 SCN 也写入重做日志文件。由以上两个操作构成的原子事件(atomic event)标志着一个事务成功地提交。
     3. Oracle释放加于表或数据行上的锁(lock)。
     4. Oracle将事务标记为完成。
     提示:在默认状态下,LGWR 将重做信息(redo log)写入联机重做日志文件(online redo log file)的工作应与事务(transaction commit)提交同步,重做信息写入磁盘后系统才能通知用户提交(commit)结束。但是为了缩短事务提交带来的延迟,应用开发者可以设定事务提交 与重做信息写入异步地执行,即事务提交无需等待重做信息被写入磁盘就可以结束。
4.2.2 事务回滚
     回滚(rolling back)的含义是撤销一个未提交事务(uncommitted transaction)中已执行的 SQL 语句对数据的修改。Oracle使用撤销表空间(undo tablespace)(或回滚段(rollback segment))来存储被修改的数据的原始值。而重做日志(redo log)内则保存了对数据修改操作的记录。
     用户可以回滚(roll back)整个未提交事务(uncommitted transaction)。除此之外,用户还可以部分回滚未提交事务,即从事务的最末端回滚到事务中任意一个被称为保存点(savepoint)的标记处。
     以下各种类型回滚操作(rollback)的过程基本相同:
     1. 语句级回滚(tatement-level rollback)(由于语句执行错误或死锁(deadlock)造成)
     2. 回滚到一个保存点(savepoint) 
     3. 依据用户请求回滚一个事务(transaction) 
     4. 由于进程异常终止而回滚一个事务 
     5. 由于实例(instance)异常终止而回滚所有正在执行的事务 
     6. 在数据库恢复(recovery)过程中回滚不完整的事务
     不考虑保存点(savepoint)而回滚(rolling back)整个事务(transaction)的过程如下:
     1. Oracle使用相关撤销表空间(undo tablespace)内的信息来撤销事务内所有 SQL 语句对数据的修改
     2. Oracle释放事务中使用的所有锁
     3. 事务结束
4.2.3 事务中的保存点
     用户在事务(transaction)内可以声明(declare)被称为保存点(savepoint)的标记。保存点将一个大事务划分为较小的片断。
     用户可以使用保存点(savepoint)在事务(transaction)内的任意位置作标记。之后用户在对事务进行回滚操作(rolling back)时,就可以选择从当前执行位置回滚到事务内的任意一个保存点。例如用户可以在一系列复杂的更新(update)操作之间插入保存点,如果执行过程中一个语句出现错误,用户 可以回滚到错误之前的某个保存点,而不必重新提交所有的语句。
     在开发应用程序时也同样可以使用保存点(savepoint)。如果一个过程(procedure)内包含多个函数(function),用户可以在每个函数的开始位置创建一个保存点。当一个函数失败时, 就很容易将数据恢复到函数执行之前的状态,回滚(roll back)后可以修改参数重新调用函数,或执行相关的错误处理。
     当事务(transaction)被回滚(rollback)到某个保存点(savepoint)后,Oracle将释放由被回滚语句使用的锁。其他等待被锁资源的事务就可以继续执行。需要更新(update)被锁数据行的事务也可以继续执行。
     将事务(transaction)回滚(roll back)到某个保存点(savepoint)的过程如下:
     1. Oracle 回滚指定保存点之后的语句。
     2. Oracle 保留指定的保存点,但其后创建的保存点都将被清除。
     3. Oracle 释放此保存点后获得的表级锁(table lock)与行级锁(row lock),但之前的数据锁依然保留。
     被部分回滚的事务(transaction)依然处于活动状态,可以继续执行。
     一个事务(transaction)在等待其他事务的过程中,进行回滚(roll back)到某个保存点(savepoint)的操作不会释放行级锁(row lock)。为了避免事务因为不能获得锁而被挂起,应在执行 UPDATE 或 DELETE 操作前使用 FOR UPDATE ... NOWAIT 语句。(以上内容讲述的是回滚保存点之前所获得的锁。而在保存点之后获得的行级锁是会被释放的,同时保存点之后执行的 SQL 语句也会被完全回滚)。
4.2.4 事务命名
     用户可以使用一个简单好记的字符串为事务(transaction)命名。事务的名称可以用于提示此事务的内容。在分布式事务(distributed transaction)中,事务命名(transaction name)已经替代了提交注释(commit comment),因为其具备以下优势:
     1. 使用事务命名有助于用户监控长时间运行的事务,以及处理不可信的分布式事务(in-doubt distributed transaction)。
     2. 用户可以在应用程序中浏览事务名及其ID。例如,DBA 可以在监控系统活动时使用企业管理器(Enterprise Manager)查看事务名称。
     3. 当兼容性参数(compatibility)被设置为 9i 或更高时,事务名可以被写入事务审计重做记录(transaction auditing redo record)中。
     4. LogMiner 可以通过事务名在重做日志(redo log)的事务审计记录(transaction auditing record)中查找特定的事务。
     5. 用户可以使用事务名在数据字典视图(data dictionary view)(例如 V$TRANSACTION)中查找特定的事务。
4.2.4.1 如何为事务命名
     用户可以在事务(transaction)开始前使用 SET TRANSACTION  NAME ... 语句为事务命名。
     当为事务(transaction)命名时,相当于将此名称与事务的 ID 绑定。因此事务名不需要唯一,同一时刻同一用户可以为不同的事务赋予相同的事务名,只要此名称对用户来说易于区分即可。
4.2.4.2 提交注释
     在之前版本 Oracle 的中,用户可以使用提交注释(commit comment)为事务(transaction)添加一个注释。但是这个注释只能在事务提交时添加。
     出于与之前版本兼容的考虑,Oracle 仍旧支持提交注释(commit comment)。但 Oracle 强烈建议用户使用事务命名(transaction name)。使用事务命名时,提交注释将被忽略。
     在以后的版本中,Oracle 将不再提供提交注释(commit comment)功能。
4.2.5 两步提交机制
     在分布式数据库(distributed database)中,Oracle 需要在网络环境下进行事务(transaction)控制,并保证数据一致性(data consistency)。而分布式环境中可能发生各种系统或网络故障。
     分布式事务(distributed transaction)指同一个事务(transaction)中的一个或多个 SQL 语句同时更新(update)分布式数据库(distributed database)中不同节点(node)的数据。
     两步提交机制(two-phase commit mechanism)可以保证所有参与分布式事务(distributed transaction)的数据库或者同时提交(commit),或者同时撤销(undo)事务中 SQL 语句的操作。两步提交机制还确保了由完整性约束(integrity constraint),远程过程调用(remote procedure call),及触发器(trigger)执行的隐式 DML 操作正常工作。
     Oracle 两步提交机制(two-phase commit mechanism)对于提交分布式事务(distributed transaction)的用户来说完全透明。用户甚至无需知道其事务是分布式的。当事务由一个 COMMIT 语句标志结束后会自动地触发两步式提交机制来提交此事务。数据库应用程序中无需使用任何代码或复杂的 SQL 语法就能处理分布式事务。
     后台进程(recoverer,RECO)能够自动地处理系统中出现的不可信的分布式事务(in-doubt distributed transaction)。不可信的分布式事务指因为各种系统或网络故障而阻碍了提交(commit)操作的分布式事务。当故障修复,通信恢复后,每个 Oracle 数据库本地的 RECO 进程将自动地提交(commit)或回滚(roll back)不可信的分布式事务,并保证所有参与分布式事务的节点协调一致。
     如果系统中的故障暂时无法恢复,Oracle允许数据库 DBA 在本地手工地提交(commit)或撤销(undo)此故障导致的不可信的分布式事务(in-doubt distributed transaction)。这个功能使本地的 DBA 可以释放被不可信的分布式事务锁住的资源。
     如果一个分布式环境中的数据库需要恢复(recovery),其他节点的 DBA 可以使用 Oracle 的恢复功能将他们各自管理的数据库也恢复到相同的时间点。这个功能保证了分布式环境中所有数据库的数据一致性(consistent)。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10356975/viewspace-680361/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10356975/viewspace-680361/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值