COMMIT
COMMIT 陳述式會結束工作單元,並確定該工作單元所做的資料庫變更。
呼叫
此陳述式可以內嵌在應用程式中,或以互動方式發出。 它是可動態準備的可執行陳述式。
如果觸發程式和觸發程式在相同的確定定義下執行,則觸發程式中不容許 COMMIT。 如果在遠端應用程式伺服器的「分散式工作單元」連線上呼叫程序,或程序定義為 ATOMIC ,則程序中不容許 COMMIT。 函數中不容許 COMMIT。
授權
無需採取任何回復動作。
語法
說明
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;
}- 透過高階語言檔案處理,透過在確定控制下開啟的檔案來存取或變更任何橫列
- 因觸發程式或 CASCADE、SET NULL 或 SET DEFAULT 參照完整性刪除規則而刪除、更新或插入的任何列。
