コミットメント制御
Db2 for i コミットメント制御サポートは、更新、挿入、削除操作、またはデータ定義言語 (DDL) 操作などのデータベース変更のグループを、単一の作業単位 ( トランザクションとも呼ばれる) として処理する手段を提供します。
コミット操作は、これらの一連の操作が完了することを保証します。 ロールバック操作は、これらの一連の操作がバックアウトされることを保証します。 保管ポイントを使用して、トランザクションをロールバック可能なより小さな単位に分けることができます。 コミット操作は各種インターフェースを介して出すことができます。 例えば、
- SQL COMMIT ステートメント
- CL COMMIT コミット
- 言語のコミット・ステートメント (RPG COMMIT ステートメントなど)
ロールバック操作は、いくつかの各種インターフェースを介して出すことができます。 例えば、
- SQL ROLLBACK ステートメント
- CL ROLLBACK コマンド
- 言語のロールバック・ステートメント (RPG ROLBK ステートメント)
次の SQL ステートメントだけは、コミットまたはロールバックすることができません。
- DROP SCHEMA
- GRANT または REVOKE (指定したオブジェクトについて権限保持者が存在する場合)
COMMIT (*NONE) 以外の分離レベルで SQL ステートメントが実行されたとき、または RELEASE ステートメントが実行されたときに、コミットメント制御がまだ開始されていない場合は、 Db2 for i はコミットメント制御開始 (STRCMTCTL) コマンドと同等の内部コマンドを実行して、コミットメント制御環境をセットアップします。 Db2 for i は、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) が送られます。
- カーソルの 1 つに COMMIT (*ALL)、COMMIT (*RR)、または COMMIT (*CS) が指定され、KEEP LOCKS 節が指定されている場合、 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) の指定があるときは、作業単位が完了する前に読み取られたデータを、他のジョブが変更するのを防止するためにも、取り出された行についての読み取りロックが使用されます。 しかし、これによって、他のジョブによる未変更の行の読み取りが妨げられることはありません。 これにより、同じ作業単位がある行を再び読み取った場合、同じ結果が得られます。 読み取りロックは、他のジョブが同じ行を取り出すのを妨げることはありません。
COMMIT(*NONE)で実行する場合、データベースはアクティビティもシリアライズする必要があります。 そのために、短命の内部ロックが取得される。 これは、COMMIT(*NONE)で実行されているアプリケーションによって、あるいはそのアプリケーションによって、ロックの競合が発生する可能性があることを意味する。
コミットメント制御では、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
SET 変数 VALUES INTO |
*なし | ロックなし(注8参照) | |
| *CHG | ロックなし(注8参照) | ||
| *CS (注 6 を参照) | 読み取りおよび解放時に行がロックされる。 | READ | |
| *ALL (注 2 および注 7 を 参照) | 読み取りから次の ROLLBACK または COMMIT まで。 | READ | |
| FETCH (読み取り専用カーソル) | *なし | ロックなし(注8参照) | |
| *CHG | ロックなし(注8参照) | ||
| *CS (注 6 を参照) | 読み取りから次の FETCH まで。 | READ | |
| *ALL (注 2 および注 7 を 参照) | 読み取りから次の ROLLBACK または COMMIT まで。 | READ | |
| FETCH (更新または削除が可能なカーソル) (注 1 を参照) | *なし | 行が更新または削除されなかった場合
読み込みから次の FETCH まで 行が更新された場合 読み込みから次の FETCH まで 行が削除された場合 読み込みから次の DELETE まで |
UPDATE |
| *CHG | 行が更新または削除されなかった場合
読み込みから次の FETCH まで 行が更新または削除された場合 読み込みから COMMIT または ROLLBACK まで |
UPDATE | |
| *CS | 行が更新または削除されなかった場合 読み込みから次の FETCH まで 行が更新または削除された場合 読み込みから COMMIT または ROLLBACK まで |
UPDATE | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
INSERT (ターゲットテーブル)
MERGE, INSERT サブステートメント |
*なし | ロックなし(注8参照) | |
| *CHG | 挿入から次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *CS | 挿入から次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *ALL | 挿入から次の ROLLBACK または COMMIT まで。 | UPDATE3 | |
| INSERT (部分選択の表) | *なし | ロックなし(注8参照) | |
| *CHG | ロックなし(注8参照) | ||
| *CS | 各行は読み取りの期間ロックされる。 | READ | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | READ | |
| UPDATE (カーソルなし) | *なし | 各行は更新の期間ロックされる。 | UPDATE |
| *CHG | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *CS | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| DELETE (カーソルなし) | *なし | 各行は削除の期間ロックされる。 | UPDATE |
| *CHG | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *CS | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| UPDATE (カーソルつき) | *なし | 読み取りから次の FETCH まで。 | UPDATE |
| *CHG | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *CS | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
MERGE UPDATE サブステートメント
|
*なし | MERGE ステートメントの完了までの読み取り | UPDATE |
| *CHG | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *CS | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| DELETE (カーソルつき) | *なし | ロックは行の削除時に解放される。 | UPDATE |
| *CHG | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *CS | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
MERGE、DELETEサブステートメント
|
*なし | MERGE ステートメントの完了までの読み取り | UPDATE |
| *CHG | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *CS | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | UPDATE | |
| 副照会 (更新または削除可能カーソルまたは UPDATE または DELETE カーソルなし) | *なし | 読み取りから次の FETCH まで。 | READ |
| *CHG | 読み取りから次の FETCH まで。 | READ | |
| *CS | 読み取りから次の FETCH まで。 | READ | |
| *ALL (注 2 を参照) | 読み取りから次の ROLLBACK または COMMIT まで。 | READ | |
| 副照会 (読み取り専用カーソルまたは SELECT INTO) | *なし | ロックなし(注8参照) | |
| *CHG | ロックなし(注8参照) | ||
| *CS | 各行は読み取りの期間ロックされる。 | READ | |
| *ALL | 読み取りから次の ROLLBACK または COMMIT まで。 | READ | |
注:
|
|||