コミットメント制御
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 プラットフォーム上にないリモート・データベースに接続している場合にサポートされます。 こうしたカーソルはロールバックでクローズされます。
| SQL ステートメント | COMMIT パラメーター (注 5 を参照) | 行ロックの期間 | ロック・ タイプ |
|---|---|---|---|
SELECT INTO |
*NONE |
ロックなし。 |
|
| FETCH (読み取り専用カーソル) | *NONE |
ロックなし。 |
|
| FETCH (更新または削除が可能なカーソル) (注 1 を参照) | *NONE |
行が更新または削除されない場合は、 |
UPDATE |
INSERT (目標表) |
*NONE |
ロックなし。 |
|
| INSERT (部分選択の表) | *NONE |
ロックなし。 |
|
| UPDATE (カーソルなし) | *NONE |
各行は更新の期間ロックされる。 |
UPDATE |
| DELETE (カーソルなし) | *NONE |
各行は削除の期間ロックされる。 |
UPDATE |
UPDATE (カーソルつき) |
*NONE |
読み取りから次の FETCH まで。 |
UPDATE |
DELETE (カーソルつき) |
*NONE |
ロックは行の削除時に解放される。 |
UPDATE |
| 副照会 (更新または削除可能カーソルまたは UPDATE または DELETE カーソルなし) | *NONE |
読み取りから次の FETCH まで。 |
READ |
| 副照会 (読み取り専用カーソルまたは SELECT INTO) | *NONE |
ロックなし。 |
|
注 :
|
|||