システムの1つのGUIとしてMSAccessを使用していますが、Accessが基になるテーブルまたは行をロックしているため、SQLサーバーがこのデータに対して更新クエリを実行できないという問題が発生しました。アクセスフロントエンドはこのデータへの読み取り専用アクセスのみを必要としますが、定期的にデータを更新するシステムが導入されているため、これは問題があります。Accessがすでにデータのロックを保持しているため、これらの更新操作は失敗します(または無期限に遅延します)。
この問題は、Accessフロントエンドを開き、sys.dm_tran_locksDMVを使用してデータのロックを表示することで説明されます。問題を再現するために私が取る手順は次のとおりです。
- Accessフロントエンドを開きます。これは、数千のレコードを持つスクロール可能なフォームを示しています
- SQLサーバーDMVを使用して、データのロックを表示します。これは、リクエストモードが「IS」(インテント共有)の5つの「オブジェクト」タイプのロックを示しています。sys.dm_exec_requestsを使用すると、コマンドステータスが「一時停止」として表示され、待機タイプが「ASYNC_NETWORK_IO」として表示されます。これらのロックは、ユーザーがAccessフロントエンドを開いている限り保持され、関連するテーブルの更新/削除/切り捨て操作を防ぎます。これで、ユーザーがAccessで設定されたレコードの最後までスクロールすると、ロックが解除されます。
2番目の問題は、ユーザーがクリックしてフロントエンドに単一のレコードを表示したときに発生します。単一のレコードが画面に表示されると、SQLサーバーのDMVは次のロックを表示します:3xオブジェクト、1xキー、1xページ。キーは共有ロックであり、他のキーは意図的に共有されます。この場合も、コマンドステータスは一時停止され、待機タイプはASYNC_NETWORK_IOです。そして、これらのロックは、ユーザーがレコードを表示している限り保持されます
アクセスがこれらのロックを無期限に保持するのを止める必要があります。残念ながら、MS Accessは私のスキルセットの一部ではないため、これを修正するために何をする必要があるのかわかりません。