コミットメント制御の開始 (STRCMTCTL) コマンドで LCKLVL パラメーターに指定する値は、コミット メント定義のコミットメント制御でオープンされて配置されるデータベース・ファイルのレコード・ロック のデフォルトのレベルになります。
ローカル・データベース・ファイルをオープンするときにデフォルトのレコード・ロック・レベルを指定変 更することはできません。ただし、SQL によってアクセスされるデータベース・ファイルは、最初に SQL ステートメントが出された時に有効な現行 SQL 分離レベルを使用します。
ロック・レベルはユーザーの要件、許容待機時間、および最も頻繁に使用される解放手順について指定する 必要があります。
以下の説明は、コミットメント制御下でオープンされるファイルだけに当てはまります。
*CHG ロック・レベル
同時に稼働する他のジョブによる変更から変更レコードを保護したい場合にはこの値を使用してく ださい。コミットメント制御下でオープンされるファイルでは、トランザクションの期間中そのロ ックが保持されます。コミットメント制御下でオープンされないファイルでは、レコード上のロッ クはレコードが読み取られるときから更新操作が完了するまで保持されます。
*CS ロック・レベル
同時に稼働する他のジョブによる変更から変更および検索レコードの両方を保護するためにこの値 を使用してください。変更されないが検索されたレコードが保護されるのは、それらのレコードが 解放されるまで、または別のレコードが検索されるまでです。
*CS ロック・レベルは、このジョブによって読み込まれた更新レコードを他のジョブは読み取るこ とができないことを保証します。さらに、別のジョブで *UPDATE のレコード・ロック・タイプ を使用してロックされたレコードをプログラムが読み取れるのは、そのジョブが別のレコードにア クセスしてからです。
*ALL ロック・レベル
コミットメント制御下で同時に稼働する他のジョブによる変更から、コミットメント制御下にある 変更レコードおよび検索レコードを保護するためにこの値を使用してください。検索または変更さ れたレコードが保護されるのは、次のコミットまたはロールバック操作までです。
*ALL ロック・レベルは、このジョブによって読み込まれた更新レコードに他のジョブがアクセス できないことを保証します。これはロックの標準プロトコルとは異なります。ロック・レベルを
*ALL に指定すると、レコードが別のジョブで *UPDATE のレコード・ロック・タイプでロックさ れている場合は、更新のために読み取るのでなくてもそのレコードにアクセスすることはできませ ん。
次の表は、ファイルがコミットメント制御下にある場合とそうでない場合のレコード・ロックの持続期間を 示しています。
要求 LCKLVL パラメーター ロックの持続期間 ロックのタイプ
読み取り専用 コミットメント制御なし ロックなし なし
*CHG ロックなし なし
*CS 読み取りから次の読み取
り、コミット、またはロー ルバック
*READ
*ALL 読み取りからコミットまた はロールバック
*READ
要求 LCKLVL パラメーター ロックの持続期間 ロックのタイプ 更新用に読み取ってから更
新または削除する 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
要求 LCKLVL パラメーター ロックの持続期間 ロックのタイプ 注:
1コミットまたはロールバック操作が更新用読み取り操作後でレコードが更新、削除、または解放される前に実行され る場合、レコードはコミットまたはロールバック操作中にアンロックされます。レコード上の保護は、コミットまた はロールバックが完了するとすぐに失われます。
2レコードが削除されてもコミットまたはロールバックがまだトランザクションに出されていないとき、削除されたレ コードはロックされたままではありません。同じまたは別のジョブが削除されたレコードをキーによって読み取ろう とすると、ジョブはレコードが見つからないという指示を受け取ります。しかし、固有キー・アクセス・パスがファ イルを超えて存在する場合、トランザクションがコミットされるまで、削除されたレコードと同じ固有キー値で別の ジョブがレコードを挿入または更新することはできません。
ロック・レベルが *CS または *ALL のときに更新のために読み取られることのないレコードには、
*READ のタイプのレコード・ロックがレコード上で取得されます。このタイプのロックは、別のジョブが
更新のために行うレコード読み取りをできなくしますが、レコードが読み取り専用操作からアクセスされる のは防げません。
*UPDATE レコード・ロック・タイプは、更新、削除、追加、または更新のための読み取りが行われるレコ
ード上で入手されます。このタイプのロックは、他のジョブが更新のためのレコードを読み取るのを防ぎ、
コミットメント制御下で稼働してレコード・ロック・レベル *CS または *ALL を持つジョブが読み取り 専用操作のためのレコードにもアクセスできないようにします。
コミットメント制御を使用していないプログラムは、別のジョブがロックしたレコードを読み取ることはで きますが、 LCKLVL パラメーターに指定される値にかかわらず、レコードを更新のために読み取ることは できません。
活動化グループまたはジョブのためのコミットメント制御が開始するときにコミットメント定義に指定され るロック・レベルは、特定のコミットメント定義に関連するオープンだけに適用されます。
注: *CS および *ALL ロック・レベル値は、現在未処理の変更のあるレコードをユーザーが別のジョブか ら取り出さないよう保護します。しかし、*CS および *ALL ロック・レベル値は、同じジョブ内の異 なる活動化グループで稼働するプログラムからの変更を現在保留している活動化グループで稼働するプ ログラムを使用して、レコードを検索しないよう保護することはありません。
同じジョブ内では、同じコミットメント定義を使用して再びレコードがアクセスされる限り、プログラムは 現行のトランザクション内で既に変更されたレコードを変更することができます。ジョブ・レベルのコミッ トメント定義を使用しているときには、変更済みのレコードへのアクセスは、ジョブ・レベルのコミットメ ント定義を使用する任意の活動化グループで稼働しているプログラムから行うことができます。
関連概念
26ページの『コミットメント制御に関する考慮事項と制約事項』
コミットメント制御に関する考慮事項および制約事項を認識しておく必要があります。
関連資料
コミットメント制御の開始 (STRCMTCTL) コマンド