データベースのレコード ロック

データ ファイルがデータストアに格納されている場合に有効にするレコード ロックの種類は、MFDBFH_RECORD_LOCKING 環境変数で制御できます。

デフォルトでは (つまり、この変数が明示的に設定されていない場合)、Micro Focus データベース ファイル ハンドラー (MFDBFH) の制御下でレコード ロックが行われ、個別のロック テーブルでレコード ロックが管理されます。このロック モードを使用している場合、COBOL ファイル操作のレコード ロックの動作は FileShare を使用している場合とほぼ同じになります。

MFDBFH_RECORD_LOCKING=database が有効な場合、MFDBFH でデータベース エンジンのネイティブのレコード ロック メカニズムを直接使用して、データ ファイルのレコードに対するロックの確立とテストを行います。これによってパフォーマンスは向上しますが、ロックの動作が従来の COBOL のレコード ロックの動作と正確には一致しなくなります。たとえば、データベースのロックでページ全体またはテーブル全体に対するロックを取得する場合、レコードがユーザー アプリケーションで明示的にロックされていなくても、ロックされているものとして処理されることがあります。その他のデータベース固有の動作の違いは次のとおりです。

Microsoft SQL Server

  • 別の実行単位によってロックされているレコードを読み取る場合、通常はレコード データと 9/68 (LOCKED) 状態が返されます。SQL Server を使用したデータベース ロック モードでは、ロックされたレコードがロックを所有する実行単位によってまだ変更されていない場合、データは返されますが、状態は 0/0 (SUCCESS) になります。これは、ロックされたレコードがまだ変更されていない場合、SQL Server ではそれらのレコードの読み取りが許可されるためです。
  • COBOL の with wait 句を使用した読み取りでは、レコードが別の実行単位によってロックされている場合に、その実行単位によってレコードがまだ変更されていなくても待機しません。理由は上記と同じです。
  • COBOL の Unlock 文でファイルのレコード ロックが解除されません。レコード ロックは同期ポイントでのみ解除されます。