COMMIT

COMMIT 陳述式會結束工作單元,並確定該工作單元所做的資料庫變更。

呼叫

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

如果觸發程式和觸發程式在相同的確定定義下執行,則觸發程式中不容許 COMMIT。 如果在遠端應用程式伺服器的「分散式工作單元」連線上呼叫程序,或程序定義為 ATOMIC ,則程序中不容許 COMMIT。 函數中不容許 COMMIT。

授權

無需採取任何回復動作。

語法

讀取語法圖跳過視覺化語法圖COMMITWORKHOLD

說明

COMMIT 陳述式會結束執行它的工作單元,並啟動新的工作單元。 在工作單元期間,它會確定 SQL 綱目陳述式 (DROP SCHEMA 除外) 及 SQL 資料變更陳述式所做的所有變更。 如需 SQL 綱目陳述式及 SQL 資料變更陳述式的相關資訊,請參閱 陳述式

處於釋放擱置狀態的連線會結束。

公務
COMMIT WORK 具有與 COMMIT 相同的效果。
保留
指定對資源的保留。 如果已指定,則不論目前開啟的游標是否以 HOLD 選項宣告,都不會關閉。 保留工作單元期間獲得的所有資源。 釋放在工作單元期間隱含獲得的特定列和物件上的鎖定。

會釋放所有隱含獲得的鎖定; 但未關閉游標所需的物件層次鎖定除外。

釋放所有未保留的定位器。 如需保留定位器的相關資訊,請參閱 HOLD LOCATOR

附註

建議的編碼實務: 明確的 COMMIT 或 ROLLBACK 陳述式應該在應用程式程序結束時編碼。 視應用程式環境而定,在應用程式程序結束時,會執行隱含的確定或回復作業。 因此,在允許明確 COMMIT 或 ROLLBACK 的環境中結束執行之前,可攜式應用程式應該先明確執行 COMMIT 或 ROLLBACK。

在下列情況下可以執行隱含的 COMMIT 或 ROLLBACK。

  • 對於預設啟動群組:
    • 當在預設啟動群組中執行的應用程式結束時,不會執行隱含的 COMMIT。 「互動式 SQL」、「查詢管理程式」及非 ILE 程式是在預設啟動群組中執行的程式範例。
    • 若要確定工作,您必須發出 COMMIT。
  • 若為非預設啟動群組,當確定定義的範圍是針對啟動群組時:
    • 如果啟動群組正常結束,則會隱含地確定確定定義。
    • 如果啟動群組異常結束,則會隱含地回復確定定義。
  • 不論啟動群組的類型為何,如果確定定義的範圍是工作,則絕不會執行隱含確定。

確定效果: 在沒有 HOLD 的情況下確定會導致發生下列情況:

  • 處於釋放擱置狀態的連線會結束。

    對於現有連線:

    • 會保留所有以 WITH HOLD 子句宣告的開啟游標,並維護其現行位置,雖然在可以執行 Positioned UPDATE 或 Positioned DELETE 陳述式之前需要 FETCH 陳述式。
    • 會關閉所有未使用 WITH HOLD 子句宣告的開啟游標 包括任何在隔離層次 NC 下開啟的開啟游標。
  • 釋放所有未保留的 LOB 定位器。 請注意,即使定位器與透過具有 WITH HOLD 內容的游標所擷取的 LOB 值相關聯,也是如此。
  • 釋放 LOCK TABLE 陳述式所獲得的所有鎖定。 會釋放所有隱含獲得的鎖定,但未關閉的游標所需要的鎖定除外。

列鎖定限制: 工作單元最多可以包括處理 400 萬列,包括 SELECT 或 FETCH 陳述式期間所擷取的列1,以及插入、刪除的列。 或更新為 INSERT、DELETE 及 UPDATE 陳述式的一部分。2

不受影響的陳述式: 確定及回復作業不會影響 DROP SCHEMA 陳述式,因此在同時指定 COMMIT (*CHG)、COMMIT (*CS)、COMMIT (*ALL) 或 COMMIT (*RR) 的應用程式中不容許此陳述式。

COMMIT 限制: 不容許在次要執行緒的使用者定義函數中進行確定或回復。

確定定義使用: SQL 所使用的確定定義如下:

  • 如果呼叫 SQL 之程式的啟動群組已使用啟動群組層次確定定義,則 SQL 會使用該確定定義。
  • 如果呼叫 SQL 之程式的啟動群組正在使用工作層次確定定義,則 SQL 會使用工作層次確定定義。
  • 如果呼叫 SQL 之程式的啟動群組目前未使用確定定義,但已啟動工作確定定義,則 SQL 會使用工作確定定義。
  • 如果呼叫 SQL 之程式的啟動群組目前未使用確定定義,且未啟動工作確定定義,則 SQL 會隱含地啟動確定定義。 SQL 使用「啟動確定控制 (STRCMTCTL)」指令與:
    • CMTSCOPE (*ACTGRP) 參數
    • 根據 CRTSQLxxx、STRSQL 或 RUNSQLSTM 指令上指定的 COMMIT 選項的 LCKLVL 參數。 在 REXX 中, LCKLVL 參數是以 SET OPTION 陳述式中的確定選項為基礎。

範例

在 C 程式中,將特定佣金 (COMM) 從一個員工 (EMPNO) 轉移至 EMPLOYEE 表格中的另一個員工。 從一列中扣除金額,然後將它新增至另一列。 使用 COMMIT 陳述式可確保在順利完成這兩項作業之前,不會對資料庫進行永久變更。

void main () 
  {
   
     EXEC SQL  BEGIN DECLARE SECTION;
     decimal(5,2) AMOUNT;
     char FROM_EMPNO[7];
     char TO_EMPNO[7];
     EXEC SQL  END DECLARE SECTION;
     EXEC SQL  INCLUDE SQLCA;
     EXEC SQL  WHENEVER SQLERROR GOTO SQLERR;
     ...
     EXEC SQL  UPDATE EMPLOYEE
               SET COMM = COMM - :AMOUNT
               WHERE EMPNO = :FROM_EMPNO;
     EXEC SQL  UPDATE EMPLOYEE
               SET COMM = COMM + :AMOUNT
               WHERE EMPNO = :TO_EMPNO;
   FINISHED:
     EXEC SQL  COMMIT WORK;
     return;

   SQLERR:
      ...
     EXEC SQL  WHENEVER SQLERROR CONTINUE;  /* continue if error on rollback */
     EXEC SQL  ROLLBACK WORK;
     return;
 }

1 此限制也包括:
  • 透過高階語言檔案處理,透過在確定控制下開啟的檔案來存取或變更任何橫列
  • 因觸發程式或 CASCADE、SET NULL 或 SET DEFAULT 參照完整性刪除規則而刪除、更新或插入的任何列。
2 除非您指定 COMMIT (*CHG) 或 COMMIT (*CS) ,否則這些列不會包含在此總計中。