コミットメント制御の開始 (STRCMTCTL) コマンドで LCKLVL パラメーターに指定する値は、 コミットメント定義のコミットメント制御でオープンされて配置されるデータベース・ファイルのレコード・ロックのデフォルトのレベルになります。
ローカル・データベース・ファイルをオープンするときにデフォルトのレコード・ロック・レベルを指定変更することはできません。ただし、SQL によってアクセスされるデータベース・ファイルは、最初に SQL ステートメントが出された時に有効な現行 SQL 分離レベルを使用します。
ロック・レベルはユーザーの要件、許容待機時間、および最も頻繁に使用される解放手順について指定する必要があります。
以下の説明は、コミットメント制御下でオープンされるファイルだけに当てはまります。
*CS ロック・レベルは、このジョブによって読み込まれた更新レコードを他のジョブは読み取ることができないことを保証します。さらに、別のジョブで *UPDATE のレコード・ロック・タイプを使用してロックされたレコードをプログラムが読み取れるのは、 そのジョブが別のレコードにアクセスしてからです。
*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 パラメーターに指定される値にかかわらず、レコードを更新のために読み取ることはできません。
活動化グループまたはジョブのためのコミットメント制御が開始するときにコミットメント定義に指定されるロック・レベルは、 特定のコミットメント定義に関連するオープンだけに適用されます。
同じジョブ内では、 同じコミットメント定義を使用して再びレコードがアクセスされる限り、 プログラムは現行のトランザクション内で既に変更されたレコードを変更することができます。ジョブ・レベルのコミットメント定義を使用しているときには、 変更済みのレコードへのアクセスは、 ジョブ・レベルのコミットメント定義を使用する任意の活動化グループで稼働しているプログラムから行うことができます。