SAVEPOINT 陳述式

使用 SAVEPOINT 陳述式來設定交易內的儲存點。

呼叫

此陳述式可以內嵌在應用程式中 (包括程序) 或以互動方式發出。 它是可動態準備的可執行陳述式。

授權

不需要任何動作。

語法

Read syntax diagramSkip visual syntax diagramSAVEPOINTsavepoint-nameUNIQUEON ROLLBACK RETAIN CURSORSON ROLLBACK RETAIN LOCKS

說明

savepoint-name
指定儲存點的名稱。 指定的 savepoint-name 不能以 'SYS' 開頭 (SQLSTATE 42939)。 如果此名稱的儲存點已在此儲存點層次內定義為 UNIQUE ,則會傳回錯誤 (SQLSTATE 3B501)。
唯一
指定當儲存點在現行儲存點層次中處於作用中 時,應用程式不打算重複使用這個儲存點名稱。 如果此儲存點層次內已存在 savepoint-name ,則會傳回錯誤 (SQLSTATE 3B501)。
ON ROLLBACK RETAIN CURSORS
針對 SAVEPOINT 陳述式之後處理的開啟游標陳述式,指定在回復至此儲存點時的系統行為。 此子句指出在可能時,游標 不受 回復至儲存點作業的影響。 對於游標受回復至儲存點影響的狀況,請參閱 ROLLBACK
ON ROLLBACK RETAIN LOCKS
指定在設定儲存點之後取得的鎖定相關回復至此儲存點時的系統行為。 不會追蹤自儲存點以來獲得的鎖定,且在回復至儲存點時不會回復 (釋放)。

規則

  • 儲存點相關陳述式不得在觸發程式定義內使用 (SQLSTATE 42987)。
  • 當發生下列其中一個事件時,會啟動新的儲存點層次:
    • 即會啟動新的工作單元 (UOW)。
    • 會呼叫以 NEW SAVEPOINT LEVEL 子句定義的程序。
    • 基本複合 SQL 陳述式開始。
  • 當完成或移除導致其建立的事件時,儲存點層次即會結束。 當儲存點層次結束時,會釋放其中包含的所有儲存點。 任何開啟游標、DDL 動作或資料修改都是由母項儲存點層次 (亦即,在其中建立剛結束的儲存點層次) 所繼承,並受限於針對母項儲存點層次發出的任何儲存點相關陳述式。
  • 下列規則適用於儲存點層次內的動作:
    • 儲存點只能在其建立所在的儲存點層次內參照。 您無法釋放、毀損或回復到現行儲存點層次之外所建立的儲存點。
    • 當儲存點層次結束時,會自動釋放現行儲存點層次內建立的所有作用中儲存點。
    • 僅在現行儲存點層次內施行儲存點名稱的唯一性。 在其他儲存點層次中作用中的儲存點名稱可在現行儲存點層次中重複使用,而不會影響其他儲存點層次中的那些儲存點。

注意事項

  • 一旦發出 SAVEPOINT 陳述式,就不容許對暱稱執行插入、更新或刪除作業。
  • 省略 UNIQUE 子句會指定另一個儲存點可以在儲存點層次內重複使用 savepoint-name 。 如果儲存點層次中已存在相同名稱的儲存點,則會毀損現有的儲存點,並在處理中的現行點建立具有相同名稱的新儲存點。 新的儲存點被視為應用程式所建立的最後一個儲存點。 請注意,透過由另一個儲存點重複使用其名稱來毀損儲存點,只會毀損該儲存點,而不會釋放在毀損的儲存點之後建立的任何儲存點。 這些後續的儲存點只能透過 RELEASE SAVEPOINT 陳述式來釋放,該陳述式會釋放指名的儲存點及在指名的儲存點之後建立的所有儲存點。
  • 如果指定 UNIQUE 子句,則只有在釋放具有相同名稱的現有儲存點之後,才能重複使用 savepoint-name
  • 在儲存點內,如果公用程式、SQL 陳述式或資料庫指令在處理期間執行間歇性確定,則會隱含地釋放儲存點。
  • 如果在儲存點內回復 SET INTEGRITY 陳述式,則動態備妥陳述式名稱仍然有效,雖然陳述式可能再次隱含地備妥。
  • 如果已緩衝插入 (亦即,已使用 INSERT BUF 選項前置編譯應用程式) ,則在發出 SAVEPOINT、ROLLBACK 或 RELEASE TO SAVEPOINT 陳述式時,會清除緩衝區。

範例

對巢狀儲存點執行回復作業。 首先,建立名為 DEPARTMENT 的表格。 在啟動 SAVEPOINT1; 插入另一列並啟動 SAVEPOINT2; 然後插入第三列並啟動 SAVEPOINT3。
   CREATE TABLE DEPARTMENT (
     DEPTNO   CHAR(6),
     DEPTNAME VARCHAR(20),
     MGRNO    INTEGER)

     INSERT INTO DEPARTMENT VALUES ('A20', 'MARKETING', 301)

     SAVEPOINT SAVEPOINT1 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('B30', 'FINANCE', 520)

     SAVEPOINT SAVEPOINT2 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('C40', 'IT SUPPORT', 430)

     SAVEPOINT SAVEPOINT3 ON ROLLBACK RETAIN CURSORS

     INSERT INTO DEPARTMENT VALUES ('R50', 'RESEARCH', 150)
此時,存在具有列 A20、 B30、 C40及 R50的 DEPARTMENT 表格。 如果您現在發出:
   ROLLBACK TO SAVEPOINT SAVEPOINT3
列 R50 不再位於 DEPARTMENT 表格中。 如果您接著發出:
   ROLLBACK TO SAVEPOINT SAVEPOINT1
部門表格仍然存在,但自建立 SAVEPOINT1 後插入的列 (B30 和 C40) 已不在表格中。