ORACLE事務管理概述

edwardking888發表於2010-07-09

在 Oracle 中一個事務(transaction)開始於首個可執行的 SQL 語句
(executable SQL statement)。可執行的 SQL 語句指產生了對例項(instance)
的呼叫(call)的 SQL 語句,包括 DML 和 DDL 語句。

當一個事務(transaction)開始時,Oracle 為此事務分配一個可用的撤銷表空
間(undo tablespace)來記錄其產生的回滾條目(rollback entry)。

一個事務(transaction)在滿足以下條件之一時結束:
使用者提交了 COMMIT 語句,或不包含 SAVEPOINT 子句的
   ROLLBACK 語句。
使用者執行了 CREATE,DROP,RENAME,或 ALTER 等 DDL 語句。
   果當前事務中包含 DML 語句,那麼 Oracle 首先提交(commit)此事
  務,然後將 DLL 語句作為一個只包含一條 SQL 語句的新事務執行並提
  交。
使用者斷開了與 Oracle 的連線。當前事務將被提交。
使用者程式異常結束。則當前事務被回滾(roll back)。

當一個事務(transaction)結束後,下一個可執行的 SQL 語句(executable
SQL statement)將會自動地開始一個新事務。

提示:
應用程式在退出時應該顯示地進行提交(commit)或回滾(roll
back)操作。

事務提交

提交(commit)一個事務(transaction)意味著將此事務中 SQL 語句對資料的修改永久地記錄到資料庫中。

在一個修改了資料的事務(transaction)被提交之前,Oracle進行了以下操
作:
● Oracle生成了撤銷資訊(undo information)。撤銷資訊包含了事務中
   各個 SQL 語句所修改的資料的原始值。
● Oracle在 SGA 的重做日誌緩衝區(redo log buffer)中生成了重做日誌
   條目(redo log entry)。重做日誌記錄(redo log record)中包含了對數
  據塊(data block)和回滾塊(rollback block)所進行的修改操作。這些
  記錄可能在事務提交之前被寫入磁碟。
● 對資料的修改已經被寫入 SGA 中的資料庫緩衝區(database buffer)。
  這些修改可能在事務提交之前被寫入磁碟。

提示:
已提交事務(committed transaction)中對資料的修改被儲存在
SGA 的資料庫緩衝區(database buffer)中,她們不一定立即被
後臺程式 DBWn 寫入資料檔案(datafile)內。Oracle將選擇適當
的時機進行寫操作以保證系統的效率。因此寫操作既可能發生
在事務提交之前,也可能在提交之後。

事務回滾

回滾(rolling back)的含義是撤銷一個未提交事務(uncommitted transaction)
中已執行的 SQL 語句對資料的修改。Oracle使用撤銷表空間(undo
tablespace)(或回滾段(rollback segment))來儲存被修改的資料的原始
值。而重做日誌(redo log)內則儲存了對資料修改操作的記錄。

使用者可以回滾(roll back)整個未提交事務(uncommitted transaction)。除此
之外,使用者還可以部分回滾未提交事務,即從事務的最末端回滾到事務中任
意一個被稱為儲存點(savepoint)的標記處。

以下各種型別回滾操作(rollback)的過程基本相同:
● 語句級回滾(tatement-level rollback)(由於語句執行錯誤或死鎖
(deadlock)造成)
● 回滾到一個儲存點(savepoint)
● 依據使用者請求回滾一個事務(transaction)
● 由於程式異常終止而回滾一個事務
● 由於例項(instance)異常終止而回滾所有正在執行的事務
● 在資料庫恢復(recovery)過程中回滾不完整的事務

不考慮儲存點(savepoint)而回滾(rolling back)整個事務(transaction)的過程如下:
1. Oracle使用相關撤銷表空間(undo tablespace)內的資訊來撤銷事務內
所有 SQL 語句對資料的修改
2. Oracle釋放事務中使用的所有鎖
3. 事務結束

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-667671/,如需轉載,請註明出處,否則將追究法律責任。

相關文章