コミットメント制御の使用

コミットメント制御は、次の処理を可能にする機能です。

データベース・レコードを同期変更する方がよいアプリケーションもあります。 変更が有効であるとプログラムが判別すると、 データベースに永続的な変更が加えられます (COMMIT ステートメントが処理されます)。 変更が無効か、または処理中に問題が発生すると、 変更は取り消されます (ROLLBACK ステートメントが処理されます)。 (OUTPUT 用のオープンの後にファイルの消去が行われた場合には、ROLLBACK を処理しても、 消去されたレコードがファイルに復元されることはありません。) コミットメント制御のもとにない ファイルのレコードに対する変更は、必ず永続的になります。 この変更は、以降の COMMIT ステートメントまたは ROLLBACK ステートメントの影響を受けることはありません。

COMMIT または ROLLBACK が正常に処理される地点は、 それぞれコミットメント境界になります。 (プログラムの中で COMMIT または ROLLBACK がまだ出されていない場合、 コミットメント制御のもとにあるいずれかのファイルを初めてオープンするときにコミットメント境界が作成されます。) 変更のコミットやロールバックを行った場合、影響を受けるのは、直前のコミットメント境界以降に行われた変更だけです。

コミットメント境界で変更を同期化すると、障害が発生した後の再始動またはリカバリーの手順が簡単になります。 詳細については 障害の後でのリカバリーを参照してください。

データベース・ファイルでコミットメント制御を使用すると、 そのファイルのレコードは以下のいずれかのロック・レベルの対象になります。

ロックされたレコードは、同一ジョブの中で同一の物理ファイルまたは論理ファイルを使用した場合に限り変更できます。

ロック・レベルは、ロックされたレコードを読み取れるかどうかも管理します。 高ロック・レベル (*ALL) を使用すると、データベース・ファイル中のロックされたレコードは読み取れません。 低ロック・レベル (*CHG) を使用した場合、データベース・ファイルをジョブの中で INPUT としてオープンするか、 または I-O として READ WITH NO LOCK を使用してオープンすれば、 そのファイルの中のロックされたレコードを読み取ることができます。

ファイルがコミットメント制御下にない 他のジョブは、 ファイルが INPUT としてオープンされている場合、使用されるロック・レベルには関係なく、ロックされたレコードを常に読み取れます。 ロックされたレコードを他のジョブが読み取る可能性があるため、データにアクセスできるのは、 そのデータがデータベースに永続的にコミットされる前 です。 ロックされたレコードを別のジョブが読み取った後に ROLLBACK ステートメントを処理した場合、 アクセスされるデータにはデータベースの内容が反映されていません。

図 99 に、コミットメント制御が行われている場合と行われていない場合に、 ファイルのレコードをロックする際の考慮事項を示します。

図 99. コミットメント制御が行われている場合と行われていない場合でのレコードのロックについての考慮事項
レコード・ロックの図
注:
更新操作には、同一のファイルについての START、READ、REWRITE、または DELETE 操作 (成功するか失敗するかに関係なく)、およびそのファイルのクローズが含まれます。 WRITE 操作は更新操作とは見なされません。 したがって、WRITE 操作の結果としてロックは設定または解放されません。

コミットメント制御下のファイルは、 最後のコミットメント境界以降に行われた変更の状況に影響を与えずに、クローズまたはオープンすることができます。 この場合にも、変更を永続的なものにするために COMMIT を出すか、変更を取り消すには ROLLBACK を出さなければなりません。 COMMIT ステートメントが処理されると、ファイルは、処理前と同じオープンまたはクローズの状態に置かれます。

OS/400 バージョン 2 リリース 3 モディフィケーション 0 以前のライセンス・プログラム をもっている場合は、同一コミットメント定義のもとで、ジョブ中でオープンしたすべての ファイルは、同一ジャーナルにジャーナル処理する必要があります。バージョン 3 リリース 1 以降では、ほとんどの場合、この制約事項は関係なくなりました。 ジャーナル管理とその関連機能の詳細について、およびコミットメント制御の詳細については、「バックアップおよび回復」を参照してください。

さらに、コミットメント制御は、OS/400 制御言語 (CL) を使用して ILE COBOL の外部で指定しなければなりません。 コミットメント制御開始 (STRCMTCTL) コマンドは、コミットメント制御の機能を確立し、 レコードをロックするレベルを高レベル (*ALL)、カーソル固定レベル (*CS)、または低レベル (*CHG) に設定します。

STRCMTCTL コマンドを使用してコミットメント制御を開始すると、 システムによってコミットメント定義が作成されます。 各コミットメント定義は、コミットメント制御の有効範囲に基づいて、STRCMTCTL コマンドを出したジョブ、 またはジョブ中の活動化グループだけに認識されます。 コミットメント定義には、ジョブまたはジョブの中の活動化グループの中の、コミットメント制御のもとで変更されるリソースに関する情報が入れられます。 コミットメント定義中のコミットメント制御情報は、システムによりコミットメント・リソース変更として維持管理されます。

STRCMTCTL コマンドは、ファイルのコミットメント制御を自動的に開始するわけではありません。 このファイルも、ILE COBOL プログラム内の I-O-CONTROL 段落の COMMITMENT CONTROL 文節に指定しなければなりません。 コミットメント制御環境を正常終了する際には、コミットメント制御の終了 (ENDCMTCTL) コマンドを使用してください。 このコマンドを使用すると、コミットメント制御下のデータベース・ファイルに関する未コミット変更がすべて取り消されます。 (暗黙の ROLLBACK が処理されます。) STRCMTCTL および ENDCMTCTL コマンドの詳細については、Web サイト http://www.ibm.com/eserver/iseries/infocenter にある iSeries Information Center の 「プログラミング」カテゴリーの中の『CL および API』セクションを参照してください。

コミットメント制御の詳細については、「バックアップおよび回復」を参照してください。

注:
変更済みの未コミット・データを読み取れないようにする機能はコミットメント制御の機能なので、 コミットメント制御のもとで実行している場合にしか使用できません。 コミットメント制御を拡張しても通常の (未コミットの) データベース・サポートを変更することはできず、 入力専用にオープンしたファイルを読み取る場合にロックされたレコードも読み取ることが可能です。 ファイルを使用する際に一貫性を保つようにしてください。 ファイルは常に、コミットメント制御のもとで実行するか、 またはコミットメント制御のもとでは実行しないかを明確にしておいてください。