2 つのスレッドが同じテーブルに対して SQL クエリを継続的に実行しているプロセスがあります。これら 2 つのスレッドのいずれかでタイムアウト エラーが発生する可能性はありますか? もしそうなら、これを避けるためのベストプラクティスは何ですか?
次のエラーが発生し、結果としてプロセスがクラッシュします。
タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
タイムアウトが発生する理由は多数あります。接続例外が発生した場合、SqlConnection のタイムアウトは何ですか? そうでない場合、SqlCommand のコマンド タイムアウトは何ですか?
クエリは適切に構成されていますか? クエリで何行返されると予想されますか? 2 つのテーブルには何行ありますか?
テーブルのロックのように聞こえます...次のような ReadUncommited オプションでトランザクションスコープを使用する必要があります。
var islolation=new TransactionOptions();
isolation=IsolationLevel.ReadUncommitted;
using(var scope=new TransactionScope(TransactionScopeOption.requiresnew,isolation))
{
//code here
scope.complete();
}
また、クエリの実行直後に接続を閉じているかどうかを確認するとよいでしょう。
テーブルに鍵をかけたようです。ロック機構を調べます。テーブル全体をロックすると非効率的です。代わりに、テーブルのサブセット、つまり行をロックできます。
また、接続文字列で、タイムアウトを減らすことができます。2 秒に変更します (クエリ データではなく、接続を確立する時間)。そのエラーが発生した場合は、そこから作業できます。
クエリが読み取りのみで、更新や挿入を行わない場合は、NOLOCKS を使用できます。
SELECT * FROM MyTable with NOLOCK
これにより、ロックが停止します。