"ファイル共有のロック数を超えました...大きなトランザクション処理中にエラーが発生する

現象

1 人以上のユーザーがマルチユーザー環境で多数のトランザクションを処理すると、トランザクションが失敗し、次のエラー メッセージが表示されることがあります。

ファイルの共有ロック数が制限を超えています。 (エラー 3052)

原因

このエラーは、トランザクションの実行に必要なロックの数が、ファイルあたりのロックの最大数を超えた場合に発生します。

回避策

重要: このセクション、メソッド、またはタスクには、レジストリの変更方法が記載されています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 レジストリを変更する際には十分に注意してください。 保護を強化するため、レジストリを変更する前にレジストリをバックアップします。 こうしておけば、問題が発生した場合にレジストリを復元できます。 レジストリのバックアップ方法および復元方法の詳細を参照するには、以下のサポート技術情報番号をクリックしてください。

322756 Windows でレジストリをバックアップおよび復元する方法

この問題を回避するには、ファイルあたりのロックの最大数を増やします。 それには、以下のいずれかの方法を使用します。

方法 1: レジストリ キーを MaxLocksPerFile に設定して、ファイルあたりのロックの最大数を増やす

  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。

  2. と入力 regeditし、[OK] をクリック します

  3. Access のインストールに応じて、次のレジストリ キーを見つけます。

    Windows インストーラー (MSI) のインストール

    • 32 ビット バージョンの Windows で実行されている 32 ビット バージョンの Access、または 64 ビット バージョンの Windows で実行されている 64 ビット バージョンの Access の場合

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    • 64 ビット バージョンの Windows で実行されている 32 ビット バージョンの Access の場合

      HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    クイック実行インストール

    • 32 ビット バージョンの Windows で実行されている 32 ビット バージョンの Access、または 64 ビット バージョンの Windows で実行されている 64 ビット バージョンの Access の場合

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    • 64 ビット バージョンの Windows で実行されている 32 ビット バージョンの Access の場合

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\<x.0>\Access Connectivity Engine\Engines\ACE

    注:

    x.0> プレースホルダーは<、Office のバージョン (16.0 = Office 2016、Office 2019、Office LTSC 2021、または Microsoft 365、15.0 = Office 2013) を表します。

  4. レジストリ エディターの右側のウィンドウで、[MaxLocksPerFile] をダブルクリックします。

  5. [ DWORD 値の編集 ] ダイアログ ボックスで、[ 10 進数] を選択します。

  6. 必要に応じて [ 値データ ] ボックスの値を変更し、[ OK] を選択します

このメソッドは、Microsoft Jet データベース エンジン バージョン 4.0 を使用するすべてのアプリケーションのレジストリ設定を変更します。

方法 2: SetOption メソッドを使用して MaxLocksPerFile を一時的に変更する

注:

この記事のサンプル コードでは、Microsoft Data Access オブジェクトを使用します。 このコードを正しく実行するには、Microsoft DAO 3.6 オブジェクト ライブラリを参照する必要があります。 これを行うには、Visual Basic エディターの [ツール] メニューの [参照] をクリックし、[Microsoft DAO 3.6 オブジェクト ライブラリ チェック] ボックスが選択されていることを確認します。

SetOption メソッドは、ファイルごとの既定のロック数を一時的にオーバーライドします。 MaxLocksPerFile レジストリ キーを設定するときに、ファイルごとに既定のロック数を設定します。 SetOption メソッドを使用して、新しい値を設定します。 新しい値は、DBEngine オブジェクトを閉じるまで有効です。 方法 2 を使用するには、次の手順に従います。

  1. Microsoft Access を開きます。

  2. データベースを開き、Alt キーを押しながら F11 キーを押して Visual Basic エディターを起動します。

  3. [Microsoft Visual Basic -<Database Name-[<モジュール名>> (コード)] ウィンドウで、[表示] メニューの [イミディエイト ウィンドウ] を選択します。

  4. [ イミディエイト ウィンドウ] に、次のコードを入力します。

    DAO.DBEngine.SetOption dbmaxlocksperfile,15000

  5. Enter キーを押してコード行を実行します。 このコマンドは、MaxLocksPerFile 値を一時的に 15,000 に設定します。

大規模なトランザクションを処理するには、要件を満たすように MaxLocksPerFile 値を設定し、セッションでトランザクションを実行します。

SetOption メソッドを使用して MaxLocksPerFile 設定に加えた変更は、現在のセッションでのみ使用できます。

詳細

MaxLocksPerFile 設定は、ファイルに対する Microsoft Jet のロックの最大数を決定します。 既定の MaxLocksPerFile 値は 9,500 です。 ただし、接続あたりの最大サーバー レコード ロック数は 10,000 であるため、Novell NetWare サーバーで作業している場合は、この値を変更しないでください。