oracle事務中的儲存點

edwardking888發表於2010-07-09

使用者在事務(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 語句也會被完全回滾)。

 

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

相關文章