コミットメント制御

Db2® for i コミットメント制御サポートは、更新、挿入、削除操作またはデータ定義言語 (DDL) 操作などのデータベース変更のグループを 1 つの作業単位 (トランザクション) として処理する手段を提供します。

コミット操作は、これらの一連の操作が完了することを保証します。 ロールバック操作は、これらの一連の操作がバックアウトされることを保証します。 保管ポイントを使用して、トランザクションをロールバック可能なより小さな単位に分けることができます。コミット操作は各種インターフェースを介して出すことができます。 例えば、次のインターフェースです。

  • SQL COMMIT ステートメント
  • CL COMMIT コミット
  • 言語のコミット・ステートメント (RPG COMMIT ステートメントなど)

ロールバック操作は、いくつかの各種インターフェースを介して出すことができます。 例えば、次のインターフェースです。

  • SQL ROLLBACK ステートメント
  • CL ROLLBACK コマンド
  • 言語のロールバック・ステートメント (RPG ROLBK ステートメント)

次の SQL ステートメントだけは、コミットまたはロールバックすることができません。

  • DROP SCHEMA
  • GRANT または REVOKE (指定したオブジェクトについて権限保持者が存在する場合)

COMMIT(*NONE) 以外の分離レベルで SQL ステートメントを実行したとき、または RELEASE ステートメントを実行したときに、コミットメント制御がまだ開始されていない場合はDb2 for i は、CL コマンドのコミットメント制御開始コマンド (STRCMTCTL) を暗黙的に呼び出して、コミットメント制御環境をセットアップします。 Db2 for i は、STRCMTCTL コマンドで、LCKLVL パラメーターと一緒に NFYOBJ(*NONE) パラメーターおよび CMTSCOPE(*ACTGRP) パラメーターを指定します。 指定した LCKLVL パラメーターは、SQL の作成 (CRTSQLxxx)、SQL 対話式セッションの開始 (STRSQL)、または SQL ステートメント実行 (RUNSQLSTM) コマンドの COMMIT パラメーター上のロック・レベルです。REXX では、指定した LCKLVL パラメーターは、SET OPTION ステートメント上のロック・レベルです。 STRCMTCTL コマンドを使用して、異なる CMTSCOPE、NFYOBJ、または LCKLVL パラメーターを指定できます。 CMTSCOPE(*JOB) を指定してジョブ・レベル・コミットメント定義を開始すると、Db2 for i は、その活動化グループの中のプログラムのジョブ・レベル・コミットメント定義を使用します。

注 :
  • コミットメント制御を用いる場合には、アプリケーション・プログラムの中でデータ操作言語 (DML) ステートメントによって参照される表は、ジャーナル処理されていなければなりません。
  • 指定した LCKLVL パラメーターは単にデフォルトのロック・レベルに過ぎません。 コミットメント制御を開始すると、SET TRANSACTION SQL ステートメントと CRTSQLxxx、 STRSQL、または RUNSQLSTM の各コマンドの COMMIT パラメーターで指定したロック・レベルとがデフォルトのロック・レベルを一時変更します。 また、LCKLVL パラメーターは、IBM® i の従来のシステム・インターフェース (非 SQL) によって要求されるコミットメント制御操作のみに適用されます。LCKLVL パラメーター上で指定されるロック・レベルは、それ以降の、SET TRANSACTION ステートメントなどを使用して加えられる SQL 分離レベルへの変更の影響を受けません。

集約関数、GROUP BY、または HAVING を使用するカーソルで、コミットメント制御下で実行しているものについては、ROLLBACK HOLD がカーソルの位置に影響することはありません。さらに、コミットメント制御下では次のことが起きます。

  • COMMIT(*CHG) および (ALWBLK(*NO) または ALWBLK(*READ)) をこれらのカーソルの 1 つに対して指定すると、COMMIT(*CHG) が要求されたが許可されなかったことを示すメッセージ (CPI430B) が送られます。
  • KEEP LOCKS 文節で COMMIT(*ALL)、COMMIT(*RR)、または COMMIT(*CS) をカーソルの 1 つに対して指定すると、Db2 for i は、参照されるすべての表を共用モード (*SHRNUP) でロックします。 このロックは、該当の表での、並行アプリケーション・プロセスの処理 (読み取り専用操作以外) を防止します。 KEEP LOCKS 文節がカーソルの 1 つに指定されている COMMIT(*ALL)、 COMMIT(*RR)、または COMMIT(*CS) が要求されたが許可されなかったことを示すメッセージ (SQL7902 または CPI430A) が送られます。メッセージ SQL0595 も送られます。

KEEP LOCKS 文節と一緒に COMMIT(*ALL)、COMMIT(*RR)、または COMMIT(*CS) が指定されており、カタログ・ファイルが使用されているか、または一時結果表が必要なカーソルについては、Db2 for i は、共有モード (*SHRNUP) のすべての参照表をロックします。これによって、該当の表での並行プロセスの処理 (読み取り専用操作以外) を防止します。 COMMIT(*ALL) が要求されたが許可されなかったことを示すメッセージ (SQL7902 または CPI430A) が送られます。メッセージ SQL0595 も送られます。

プログラムのプリコンパイル時に ALWBLK(*ALLREAD) と COMMIT(*CHG) の指定があった場合は、すべての読み取り専用カーソルは行のブロック化を可能にするので、ROLLBACK HOLD はカーソル位置をロールバックしません。

COMMIT(*RR) が要求されると、表は、照会がクローズされるまでロックされます。カーソルが読み取り専用のときは、表は (*SHRNUP で) ロックされます。カーソルが更新モードにある時は、表は (*EXCLRD で) ロックされます。 他のユーザーは表から締め出されるため、反復可能読み取りによる実行は、表への並行アクセスを阻止します。

COMMIT(*RR) を使用する競合性の高い環境では、アプリケーションは、SQL0913 を取得してデータベース・アンロック・メカニズム時間が作動できるようにした後で、操作を再試行する必要が生じることがあります。

COMMIT(*NONE) 以外の分離レベルが指定され、アプリケーションが ROLLBACK を出すか、または活動化グループが異常終了した場合 (しかも、コミットメント定義が *JOB でない場合) は、作業単位内で行ったすべての更新、挿入、削除、および DDL 操作はバックアウトされます。 アプリケーションが COMMIT を出すか、または活動化グループが通常どおり終了した場合は、作業単位内で行ったすべての更新、挿入、削除、および DDL 操作はコミットされます。

Db2 for i は、行についてのロックを使用して、作業単位が完了する前に、変更したデータに他のジョブがアクセスしないようにします。 COMMIT(*ALL) の指定があるときは、作業単位が完了する前に読み取られたデータを、他のジョブが変更するのを防止するためにも、取り出された行についての読み取りロックが使用されます。 しかし、これによって、他のジョブによる未変更の行の読み取りが妨げられることはありません。 これにより、同じ作業単位がある行を再び読み取った場合、同じ結果が得られます。 読み取りロックは、他のジョブが同じ行を取り出すのを妨げることはありません。

コミットメント制御では、1 つの作業単位内で最大 500,000,000 の異なる行変更を処理することができます。 COMMIT(*ALL) または COMMIT(*RR) の指定がある場合は、読み取られる総数行もこの制限に含められます。(1 つの作業単位内で同じ行が複数回読み取られたり変更されたりしても、それは、この制限に対しては 1 回として数えられます。) 多数のロックを保持すると、システム・パフォーマンスが低下するだけでなく、ある作業単位内でロックされている行に対しては、その作業単位が終了するまでは同時に使用しているユーザーがアクセスできなくなります。 したがって、1 つの作業単位で処理される行の数をできるだけ少なくすることが、効率化を図るための最も有効な方法です。

COMMIT HOLD および ROLLBACK HOLD を使用すると、カーソルはオープンされたままになるので、OPEN ステートメントを出し直さなくても、別の作業単位を開始することができます。 HOLD の値は、IBM i プラットフォーム上にないリモート・データベースに接続されている場合は、利用不能です。ただし、DECLARE CURSOR 上の WITH HOLD オプションを使用すると、コミットの後でもカーソルをオープンしたままにしておくことができます。 このタイプのカーソルは、IBM i プラットフォーム上にないリモート・データベースに接続している場合にサポートされます。 こうしたカーソルはロールバックでクローズされます。

表 1. 行のロック期間
SQL ステートメント COMMIT パラメーター (注 5 を参照) 行ロックの期間 ロック・ タイプ

SELECT INTO
SET 変数
VALUES INTO

*NONE
*CHG
*CS (注 6 を参照)
*ALL (注 2 および注 7 を
参照)

ロックなし。
ロックなし。
読み取りおよび解放時に行がロックされる。
読み取りから次の ROLLBACK または COMMIT まで。

 
 
READ
READ

FETCH (読み取り専用カーソル)

*NONE
*CHG
*CS (注 6 を参照)
*ALL (注 2 および注 7 を
参照)

ロックなし。
ロックなし。
読み取りから次の FETCH まで。
読み取りから次の ROLLBACK または COMMIT まで。

 
 
READ
READ

FETCH (更新または削除が可能なカーソル) (注 1 を参照)

*NONE
 
 
 


*CHG
 
 
 
*CS
 
 
 
*ALL

行が更新または削除されない場合は、
読み取りから次の FETCH まで。
行が更新される場合は、
読み取りから次の FETCH まで。
行が削除される場合は、
読み取りから次の DELETE まで。
行が更新または削除されない場合は、
読み取りから次の FETCH まで。
行が更新または削除される場合は、
読み取りから次の COMMIT または ROLLBACK まで。
行が更新または削除されない場合は、
読み取りから次の FETCH まで。
行が更新または削除される場合は、
読み取りから次の COMMIT または ROLLBACK まで。
読み取りから次の ROLLBACK または COMMIT まで。

UPDATE
 
 
 
UPDATE
 
 
 
UPDATE
 
 
 
UPDATE

INSERT (目標表)
MERGE, INSERT
   sub-statement

*NONE
*CHG
*CS
*ALL

ロックなし。
挿入から次の ROLLBACK または COMMIT まで。
挿入から次の ROLLBACK または COMMIT まで。
挿入から次の ROLLBACK または COMMIT まで。

 
UPDATE
UPDATE
UPDATE3

INSERT (部分選択の表)

*NONE
*CHG
*CS
*ALL

ロックなし。
ロックなし。
各行は読み取りの期間ロックされる。
読み取りから次の ROLLBACK または COMMIT まで。

 
 
READ
READ

UPDATE (カーソルなし)

*NONE
*CHG
*CS
*ALL

各行は更新の期間ロックされる。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。

UPDATE
UPDATE
UPDATE
UPDATE

DELETE (カーソルなし)

*NONE
*CHG
*CS
*ALL

各行は削除の期間ロックされる。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。

UPDATE
UPDATE
UPDATE
UPDATE

UPDATE (カーソルつき)
MERGE, UPDATE
   sub-statement

*NONE
*CHG
*CS
*ALL

読み取りから次の FETCH まで。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。

UPDATE
UPDATE
UPDATE
UPDATE

DELETE (カーソルつき)
MERGE, DELETE
   sub-statement

*NONE
*CHG
*CS
*ALL

ロックは行の削除時に解放される。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。
読み取りから次の ROLLBACK または COMMIT まで。

UPDATE
UPDATE
UPDATE
UPDATE

副照会 (更新または削除可能カーソルまたは UPDATE または DELETE カーソルなし)

*NONE
*CHG
*CS
*ALL (注 2 を参照)

読み取りから次の FETCH まで。
読み取りから次の FETCH まで。
読み取りから次の FETCH まで。
読み取りから次の ROLLBACK または COMMIT まで。

READ
READ
READ
READ

副照会 (読み取り専用カーソルまたは SELECT INTO)

*NONE
*CHG
*CS
*ALL

ロックなし。
ロックなし。
各行は読み取りの期間ロックされる。
読み取りから次の ROLLBACK または COMMIT まで。

 
 
READ
READ

注 :
  1. 結果表が読み取り専用ではなく、かつ次のうちの 1 つに該当する場合には、カーソルは UPDATE または DELETE の機能によりオープンされます。
    • カーソルが FOR UPDATE 文節により定義されている。
    • カーソルが FOR UPDATE 文節、FOR READ ONLY 文節、または ORDER BY 文節なしで定義されており、プログラムに次のうち少なくとも 1 つが入っている。
      • 同じカーソル名を参照するカーソル UPDATE
      • 同じカーソル名を参照するカーソル DELETE
      • CRTSQLxxx コマンドで指定された EXECUTE または EXECUTE IMMEDIATE ステートメントおよび ALWBLK(*READ) または ALWBLK(*NONE)
  2. COMMIT(*ALL) を満足するために表またはビューを排他的にロックすることができます。 UNION を含む部分選択が処理される場合、または照会の処理のために一時的な結果の使用が必要である場合は、コミットされていない変更がユーザーに表示されることがないように排他的ロックが取得されます。
  3. 目標表の行に対する UPDATE ロックおよび部分選択表の行に対する READ ロック。
  4. 反復可能読み取りを満足するために表またはビューを排他的にロックすることができます。 その場合でも、行のロックは反復可能読み取りの下で行われます。取得されるロックとその期間は *ALL と同じです。
  5. 反復可能読み取り (*RR) 行のロックは、*ALL のために表示されるロックと同じになります。
  6. KEEP LOCKS 文節が *CS で指定される場合、読み取りロックがあればカーソルがクローズされるまで、または COMMIT か ROLLBACK が実行されるまで保持されます。 分離文節と関連付けられるカーソルがない場合、ロックは SQL ステートメントが完了するまで保持されます。
  7. USE AND KEEP EXCLUSIVE LOCKS 文節に *RS または *RR 分離レベルが指定されている場合、READ ロック (読み取りロック) の代わりに、行の UPDATE ロック (更新ロック) が適用されます。