COMMIT ステートメント
COMMIT ステートメントにより、それが実行されるリカバリー単位は終了し、処理用に新規リカバリー単位が開始されます。 SQL スキーマ・ステートメントおよび SQL データ変更ステートメントによってその作業単位で実行されたすべての変更が、このステートメントによってコミットされます。
呼びかけ COMMIT
このステートメントは、アプリケーション・プログラムに組み込むか、あるいは対話式に発行することができます。 このステートメントは、動的に作成できる実行可能ステートメントです。 IMS または CICS® 環境では使用できません。
承認 COMMIT
不要です。
構文 COMMIT
説明の対象: COMMIT
COMMIT ステートメントにより、それが実行されるリカバリー単位は終了し、処理用に新規リカバリー単位が開始されます。 SQL スキーマ・ステートメントおよび SQL データ変更ステートメントによってその作業単位で実行されたすべての変更が、このステートメントによってコミットされます。 詳細については、 Db2 for z/OS のSQLステートメントを参照してください。
注釈 COMMIT
- 推奨されるコーディング・プラクティス
アプリケーション・プロセスの最後に、明示的なCOMMIT文またはROLLBACK文をコードする。 アプリケーション環境に応じて、アプリケーション・プロセスの最後で暗黙的なコミットまたはロールバック操作のいずれかが実行されます。 したがって、明示的な COMMIT または ROLLBACK が許可される環境では、実行が終了する前にポータブル・アプリケーションが COMMIT ステートメントまたは ROLLBACK ステートメントを明示的に実行する必要があります。
- COMMITの効果
復旧単位内に設定されたすべてのセーブポイントは解放され、復旧単位内に実行された以下のステートメントについては、すべての変更がコミットされる:
- ALTER
- COMMENT
- CREATE
- DELETE
- DROP
- EXPLAIN
- GRANT
- INSERT
- ラベル
- MERGE
- RENAME
- REVOKE
- UPDATE
- SQL データ変更ステートメント付きの SELECT INTO
- SQL データ変更ステートメントによる副選択
以下のどの条件でも当てはまる場合、SQL 接続 は終了します。
- 接続が解除ペンディング状況になっている場合。
- 接続は解除ペンディング状況にはないが、接続がリモート接続であり、以下のいずれかに当てはまる場合。
- DISCONNECT(AUTOMATIC) バインド・オプションが使われている。
- DISCONNECT(CONDITIONAL) バインド・オプションが使われており、WITH HOLD でオープンされているカーソルが接続に関連付けられていない。
既存の接続の場合、すべての LOB ロケーターの関連付けが解除 されます。ただし、HOLD LOCATOR ステートメントが出されていて、対応 する FREE LOCATOR ステートメントがないロケーターを除きます。 WITH HOLD オプションを指定せずに宣言されたオープン・カーソルはすべてクローズ されます。 WITH HOLD オプションを指定して宣言 されたオープン・カーソルはすべて保存されます。これらの カーソル用に準備された SELECT ステートメントがあるときは、 それらのステートメントも一緒に保存されます。
ON COMMIT DROP TABLE を指定せずに定義された宣言済みグローバル一時表を参照しており、RELEASE(DEALLOCATE) オプションにバインドされているもしくはこのオプションを使用している静的および動的 INSERT、UPDATE、DELETE、および MERGE ステートメントは、コミット・ポイントを過ぎても保持されます。 以下のいずれかの条件に該当する場合、ステートメントはコミット・ポイント間で保持されません。
- ON COMMIT DROP TABLE オプションで、宣言済みグローバル一時表が定義されている。
- ステートメントが RELEASE(COMMIT) バインド・オプションを使用している。
- このステートメントは、 Db2 ベースオブジェクト(テーブルやビューなど)を参照しており、以下のいずれかのステートメントが真である
- 基本オブジェクト参照は、 Db2 カタログテーブル用です。
- コミットポイントで、 Db2 は、ベースオブジェクトのデータベース記述子(DBD)のX-ロックを待っている別の Db2 スレッドがあることを検出します。
- このステートメントはXML関数または操作を参照しており、コミットポイントで Db2 はXML操作のベースオブジェクトDBD S-ロックを解放する必要があると判断します。
- コミットポイントにおいて、 Db2 は、ステートメントで使用されているベースオブジェクトDBD S-ロックを解放する必要があり、コミットポイントをまたいで維持することはできないと判断します。
- Db2 別の スレッドが、そのステートメントを含む パッケージのX-lockを待っていることを決定します。 Db2 Db2
以下の条件のいずれかに該当する場合、準備済み動的ステートメントはコミット・ポイントを過ぎても保持されます。
- ご使用のシステムで動的キャッシュが有効である。 その場合、KEEPDYNAMIC(YES) を指定してバインドされたすべての準備済み SELECT およびデータ変更ステートメントは、コミット・ポイントを過ぎても保持されます。
- ステートメントが ON COMMIT DROP TABLE を指定せずに定義された宣言済みグローバル一時表を参照し、パッケージが RELEASE(DEALLOCATE) オプションを指定してバインドされたか、このオプションを使用する。 その場合、宣言済みグローバル一時表を参照するすべての準備済み INSERT、UPDATE、DELETE、および MERGE ステートメントは、コミット・ポイントを過ぎても保持されます。
以下の条件のいずれかが満たされる場合、準備済みステートメントはコミット後は保持 されません。
- その場所で SQL RELEASE が出された。
- バインド・オプション DISCONNECT(AUTOMATIC) が使用された。
- バインド・オプション DISCONNECT(CONDITIONAL) が使用されており、その場所でオープン中の WITH HOLD カーソルがない。
- ステートメントが宣言済みグローバル一時表を参照しており、オープン中の WITH HOLD カーソルを持たず、RELEASE(COMMIT) オプションを指定してバインドされたパッケージ内にある。
- ステートメントが、ON COMMIT DROP TABLE オプションを指定して定義された宣言済みグローバル一時表を参照する。 また、ステートメントにオープン中の WITH HOLD カーソルがなく、ステートメントのパッケージが RELEASE(DEALLOCATE) オプションを指定してバインドされたか、このオプションを使用する。
暗黙的に獲得されたロックはすべて解除されます。ただし、以下のロックを除きます。
- クローズされなかったカーソルに必要なロック
- バインド・コマンド上の RELEASE パラメーター が RELEASE(COMMIT) でなかった場合の表および表スペースのロック
- 保留 LOB ロケーターに必要な LOB ロック および LOB 表スペース・ロック
明示的に取得したロックの持続時間については、 Db2 for z/OS の「ロックの持続時間と解放の動作 」を参照してください。
アプリケーション処理のすべての作成済みの一時表のすべての行は、削除されます。 ただし、アプリケーション処理の任意のプログラムが、その表に従属している オープン中の WITH HOLD カーソルを持っている場合には、作成済みの一時表の行は削除されません。 さらに、 RELEASE(COMMIT) が有効な場合は、行が削除されるこれらの作成済みの一時表の論理作業ファイルも削除されます。
アプリケーション・プロセスのすべての宣言済み一時表のすべての行は、以下の場合を除き、削除されます。
- ON COMMIT PRESERVE ROWS 属性を使用して定義されている宣言済み一時表の行は、削除されません。
- アプリケーション処理の任意のプログラムが、その表に従属している オープン中の WITH HOLD カーソルを持っている場合には、ON COMMIT DELETE ROWS 属性を使用して定義されている宣言済み一時表の行は削除されません。
- 暗黙のコミット操作
- すべての Db2 環境において、プロセスの通常の終了は暗黙のコミット操作である。
- COMMITの使用制限
- COMMIT文は、 IMS または CICS 環境では使用できない。 SQL プログラムが、これらの環境においてコミット操作を実行するためには、
そのトランザクション管理プログラムによって規定された呼び出しを
使わなければなりません。 Db2 データに対するこれらのコミット操作の効果は、SQL COMMIT ステートメントの効果と同じです。
ユーザー定義関数またはトリガーの呼び出しチェーン内にストアドプロシージャがある場合、または Db2 がコミットコーディネーターでない場合、COMMITステートメントはストアドプロシージャで使用できません。
- 特殊レジスタへのコミットの影響
- COMMIT文を発行すると、特別なレジスタが再初期化されることがある。 これらの特殊レジスターのいずれかがコミットの影響を受けるかどうかは、アプリケーション・プロセスの中で特殊レジスターが明示的に設定されたかどうかによって決まります。 例えば、PATH 特殊レジスターが、アプリケーション・プロセスの中で SET PATH ステートメントによって明示的に設定されなかったとします。 コミットの後、PATH の値は再初期化されます。 CURRENT SQLIDの現在値を考慮できるPATHの初期化に関する情報は、 CURRENT PATH特別レジスタを参照のこと。
- グローバル変数へのコミットの影響
グローバル変数はトランザクション・レベルでは制御されないので、通常、COMMIT文を発行してもグローバル変数の内容には影響しない。
例) COMMIT
COMMIT WORK;