1

私たちのアプリケーションは、顧客のマシンで別のアプリケーションと一緒に実行されます。これは同時実行性に明らかに悪影響を与えるため、tempdb で長時間実行されるロックを回避するためにいくつかの努力を払いました。ただし、他のアプリケーションは次のようなことを行います。


begin transaction
create #Table(...);
#Table(....) 値(...) に挿入します。
operation_for_totally_six_seconds()。
専念;

操作には時間がかかるため、アプリケーションは他のアプリケーションがロックを取得するのを待ってスタックします。

現在、たとえば SQL Server に別の tempdb を割り当てるように指示するなどして、自分のアプリケーションを他のアプリケーションから分離する方法があると期待していますが、方法は見つかりませんでした。これはどういうわけか可能ですか、それとも別の mssql インスタンスにデータベースをインストールする解決策ですか?

よろしく、 イェンス・ノルデンブロ

4

2 に答える 2

3

これは明らかに同時実行性に悪影響を与えるため、tempdbの長時間実行ロック

それは実際にはまったく明らかではありません。長時間保持されたロックは、あなたと他のアプリケーションが同じロックを実行する場合にのみ重要です。あなたが投稿したコードサンプルは完全に合法です。まず第一に、#tempは接続固有のテーブルであり、他の接続ではそれを見ることができません。ただし、グローバルリソースであっても、他のアプリケーションに属しているため、ロックを取得する必要はありません。

演習として、SSMSクエリウィンドウを開き、次のコマンドを実行します。

begin transaction;
create table #temp (a int);

次に、2番目のクエリウィンドウを開き、同じように実行します。QEDまったく同じ#tempテーブルを作成しているにもかかわらず、それらは互いにブロックしません。

tempdbが実際にボトルネックである場合は、さらに調査を行い、競合が発生している実際のリソースを見つける必要があります。

于 2009-12-07T16:48:28.423 に答える
1

1 つのオプションは、同じマシン上の SQL Server の別のインスタンスでアプリを実行することです。このようにして、独自の tempdb が作成されます。

于 2009-12-07T14:43:16.770 に答える