ロック・レベルのコミット

コミットメント制御の開始 (STRCMTCTL) コマンドで LCKLVL パラメーターに指定する値は、 コミットメント定義のコミットメント制御でオープンされて配置されるデータベース・ファイルのレコード・ロックのデフォルトのレベルになります。

ローカル・データベース・ファイルをオープンするときにデフォルトのレコード・ロック・レベルを指定変更することはできません。ただし、SQL によってアクセスされるデータベース・ファイルは、最初に SQL ステートメントが出された時に有効な現行 SQL 分離レベルを使用します。

ロック・レベルはユーザーの要件、許容待機時間、および最も頻繁に使用される解放手順について指定する必要があります。

以下の説明は、コミットメント制御下でオープンされるファイルだけに当てはまります。

*CHG ロック・レベル
同時に稼働する他のジョブによる変更から変更レコードを保護したい場合にはこの値を使用してください。コミットメント制御下でオープンされるファイルでは、 トランザクションの期間中そのロックが保持されます。コミットメント制御下でオープンされないファイルでは、 レコード上のロックはレコードが読み取られるときから更新操作が完了するまで保持されます。
*CS ロック・レベル
同時に稼働する他のジョブによる変更から変更および検索レコードの両方を保護するためにこの値を使用してください。変更されないが検索されたレコードが保護されるのは、 それらのレコードが解放されるまで、または別のレコードが検索されるまでです。

*CS ロック・レベルは、このジョブによって読み込まれた更新レコードを他のジョブは読み取ることができないことを保証します。さらに、別のジョブで *UPDATE のレコード・ロック・タイプを使用してロックされたレコードをプログラムが読み取れるのは、 そのジョブが別のレコードにアクセスしてからです。

*ALL ロック・レベル
コミットメント制御下で同時に稼働する他のジョブによる変更から、 コミットメント制御下にある変更レコードおよび検索レコードを保護するためにこの値を使用してください。検索または変更されたレコードが保護されるのは、 次のコミットまたはロールバック操作までです。

*ALL ロック・レベルは、このジョブによって読み込まれた更新レコードに他のジョブがアクセスできないことを保証します。これはロックの標準プロトコルとは異なります。ロック・レベルを *ALL に指定すると、 レコードが別のジョブで *UPDATE のレコード・ロック・タイプでロックされている場合は、 更新のために読み取るのでなくてもそのレコードにアクセスすることはできません。

次の表は、ファイルがコミットメント制御下にある場合とそうでない場合のレコード・ロックの持続期間を示しています。

要求 LCKLVL パラメーター ロックの持続期間 ロックのタイプ
読み取り専用 コミットメント制御なし ロックなし なし
*CHG ロックなし なし
*CS 読み取りから次の読み取り、コミット、またはロールバック *READ
*ALL 読み取りからコミットまたはロールバック *READ
更新用に読み取ってから更新または削除する 1 コミットメント制御なし 読み取りから更新または削除 *UPDATE
*CHG 読み取りから更新または削除 *UPDATE
更新または削除から次のコミットまたはロールバック 2 *UPDATE
*CS 読み取りから更新または削除 *UPDATE
更新または削除から次のコミットまたはロールバック 2 *UPDATE
*ALL 読み取りから更新または削除 *UPDATE
更新または削除から次のコミットまたはロールバック 2
更新用に読み取ってから解放する 1 コミットメント制御なし 読み取りから解放 *UPDATE
*CHG 読み取りから解放 *UPDATE
*CS 読み取りから解放、コミットまたはロールバック *UPDATE
解放から次の読み取り、コミット、またはロールバック *UPDATE
*ALL 読み取りから解放、コミットまたはロールバック *UPDATE
  解放から次のコミットまたはロールバック
追加 コミットメント制御なし ロックなし なし
*CHG 追加からコミットまたはロールバック *UPDATE
*CS 追加からコミットまたはロールバック *UPDATE
*ALL 追加からコミットまたはロールバック *UPDATE
直接書き込み コミットメント制御なし 直接書き込み期間 *UPDATE
*CHG 直接書き込みからコミットまたはロールバック *UPDATE
*CS 直接書き込みからコミットまたはロールバック *UPDATE
*ALL 直接書き込みからコミットまたはロールバック *UPDATE
注:

1コミットまたはロールバック操作が更新用読み取り操作後でレコードが更新、 削除、または解放される前に実行される場合、 レコードはコミットまたはロールバック操作中にアンロックされます。レコード上の保護は、コミットまたはロールバックが完了するとすぐに失われます。

2レコードが削除されてもコミットまたはロールバックがまだトランザクションに出されていないとき、削除されたレコードはロックされたままではありません。同じまたは別のジョブが削除されたレコードをキーによって読み取ろうとすると、 ジョブはレコードが見つからないという指示を受け取ります。しかし、固有キー・アクセス・パスがファイルを超えて存在する場合、 トランザクションがコミットされるまで、 削除されたレコードと同じ固有キー値で別のジョブがレコードを挿入または更新することはできません。

ロック・レベルが *CS または *ALL のときに更新のために読み取られることのないレコードには、 *READ のタイプのレコード・ロックがレコード上で取得されます。このタイプのロックは、 別のジョブが更新のために行うレコード読み取りをできなくしますが、 レコードが読み取り専用操作からアクセスされるのは防げません。

*UPDATE レコード・ロック・タイプは、 更新、削除、追加、または更新のための読み取りが行われるレコード上で入手されます。このタイプのロックは、他のジョブが更新のためのレコードを読み取るのを防ぎ、 コミットメント制御下で稼働してレコード・ロック・レベル *CS または *ALL を持つジョブが読み取り専用操作のためのレコードにもアクセスできないようにします。

コミットメント制御を使用していないプログラムは、別のジョブがロックしたレコードを読み取ることはできますが、 LCKLVL パラメーターに指定される値にかかわらず、レコードを更新のために読み取ることはできません。

活動化グループまたはジョブのためのコミットメント制御が開始するときにコミットメント定義に指定されるロック・レベルは、 特定のコミットメント定義に関連するオープンだけに適用されます。

注: *CS および *ALL ロック・レベル値は、現在未処理の変更のあるレコードをユーザーが別のジョブから取り出さないよう保護します。しかし、*CS および *ALL ロック・レベル値は、 同じジョブ内の異なる活動化グループで稼働するプログラムからの変更を現在保留している活動化グループで稼働するプログラムを使用して、 レコードを検索しないよう保護することはありません

同じジョブ内では、 同じコミットメント定義を使用して再びレコードがアクセスされる限り、 プログラムは現行のトランザクション内で既に変更されたレコードを変更することができます。ジョブ・レベルのコミットメント定義を使用しているときには、 変更済みのレコードへのアクセスは、 ジョブ・レベルのコミットメント定義を使用する任意の活動化グループで稼働しているプログラムから行うことができます。