7

システムの1つのGUIとしてMSAccessを使用していますが、Accessが基になるテーブルまたは行をロックしているため、SQLサーバーがこのデータに対して更新クエリを実行できないという問題が発生しました。アクセスフロントエンドはこのデータへの読み取り専用アクセスのみを必要としますが、定期的にデータを更新するシステムが導入されているため、これは問題があります。Accessがすでにデータのロックを保持しているため、これらの更新操作は失敗します(または無期限に遅延します)。

この問題は、Accessフロントエンドを開き、sys.dm_tran_locksDMVを使用してデータのロックを表示することで説明されます。問題を再現するために私が取る手順は次のとおりです。

  1. Accessフロントエンドを開きます。これは、数千のレコードを持つスクロール可能なフォームを示しています
  2. SQLサーバーDMVを使用して、データのロックを表示します。これは、リクエストモードが「IS」(インテント共有)の5つの「オブジェクト」タイプのロックを示しています。sys.dm_exec_requestsを使用すると、コマンドステータスが「一時停止」として表示され、待機タイプが「ASYNC_NETWORK_IO」として表示されます。これらのロックは、ユーザーがAccessフロントエンドを開いている限り保持され、関連するテーブルの更新/削除/切り捨て操作を防ぎます。これで、ユーザーがAccessで設定されたレコードの最後までスクロールすると、ロックが解除されます。

2番目の問題は、ユーザーがクリックしてフロントエンドに単一のレコードを表示したときに発生します。単一のレコードが画面に表示されると、SQLサーバーのDMVは次のロックを表示します:3xオブジェクト、1xキー、1xページ。キーは共有ロックであり、他のキーは意図的に共有されます。この場合も、コマンドステータスは一時停止され、待機タイプはASYNC_NETWORK_IOです。そして、これらのロックは、ユーザーがレコードを表示している限り保持されます

アクセスがこれらのロックを無期限に保持するのを止める必要があります。残念ながら、MS Accessは私のスキルセットの一部ではないため、これを修正するために何をする必要があるのか​​わかりません。

4

2 に答える 2

5

私はこの問題を解決しませんでしたが、同僚は解決しました。行われたのは、SQL Serverテーブルへのリンクテーブルを作成する代わりに、ビューへのリンクテーブルを作成したことです。ビューは次のようになりました。

CREATE VIEW dbo.acc_tblMyTable
AS
  SELECT * FROM tblMyTable WITH (NOLOCK)

ロックはなく、ボーナスとしてAccessはデータを読み取り専用として扱いました。

ただし、使用すると何が起こるかNOLOCKを理解してください。

残念ながら、MS Accessは私のスキルセットの一部ではないため、これを修正するために何をする必要があるのか​​わかりません。

アクセスを取り除く:)

于 2012-08-19T11:52:13.783 に答える
-2

SQLServerをバックエンドとして使用するアプリケーションを何年にもわたって開発してきました。あなたが議論しているロック(ブロッキング)の問題に遭遇したことはありません。また、適切に設計されたデータベースは、更新時にSQLServerのデフォルトの行レベルのロックを使用する必要があります。

問題なのはアクセスです。かつてそれはそれが完全に制御していた内部データベースを持っていたので、それが持っているものであり、振る舞いはそれが正しいと考えるものであると考え続けています。事実上、SQL Serverの実行は終了し、正しいと思われることを実行します。Accessはファイルベースの製品であり、本番環境に対応していない製品であるため、あまり良いことではありません。電話帳やレシピに適しています。それだけです。どちらもスケーリングしません。

于 2014-07-08T17:02:14.693 に答える