1

私は現在、私のウェブサイトで厄介な問題を調査しています。ウェブサイトで定期的に賞品を提供していますが、コンテストに参加するにはログインする必要があります。そのため、ウェブサイトは時々非常に忙しくなります。多くの人がログインして登録しようとすると、UpdateUser、CheckPassword、および GetUser関数のデッドロックに関する大量のエラーが発生し、サーバーがビジー状態になり、他の要求がタイムアウトし始めることがわかりました。

ストアド プロシージャを調べると、'UpdateUser' で ROWLOCK が使用されていることがわかりました。これらの ROWLOCK がデッドロックの原因ですか? または、選択だけでデッドロックが発生しますか?

自分の状況でNOLOCKを使おうと思っていたのですが、ちょっと調べてみると、どうやらお勧めできないようです...

4

2 に答える 2

-3

WITH (NOLOCK) は、マイクロ秒単位でデータを取得する際の時間の機密性が重要でない場合、または新しく追加されたレコードの選択が適切に行われない場合に、SELECT ステートメントで使用されます。

WITH (ROWLOCK) は UPDATE ステートメントで使用され、行のロックを行レベル ロックで維持し、複数の行やテーブル ロックにエスカレートしないようにします。

select ステートメントと update ステートメントでは常に両方を使用する必要があります。また、適切にインデックスを作成し、反復データをキャッシュして、ほとんど変化しないデータについてデータベースにクエリをすばやく実行しないようにし、ログイン ロジックを調べて判断する必要があります。不必要なデータのログ記録を実行していない場合、また SQL エラー ログを調べて、Web サイトへのアクセスを遅くしている可能性のあるエラーがないか確認してください。

于 2012-10-04T16:09:15.713 に答える