0

誰かがページを表示したときにテーブルの行を更新しようとしています (表示カウントが増加します) が、時々デッドロック エラーが発生します。同じ列?

エラーは次のとおりです。

Transaction (Process ID 60) was deadlocked on lock | communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

そして私のSQLは:

UPDATE [ProductDescription] 
SET [ViewCount] = ([ViewCount] + 1) 
WHERE ProductCode = @prodCode 
    AND ApplicationID = @AppID

WITH(NOLOCK) が必要だと思いますか?

4

3 に答える 3

0

NOLOCKは必要ありません。これにより、読み取りロックが解除されるだけで、予期しない結果が発生します。より良い方法は、更新ステートメントで TABLOCK を使用することです。これは、終了するまで他のプロセスがテーブルにアクセスできないことを意味します。

于 2012-11-02T10:45:44.703 に答える
-1

データを適切に更新するには、トランザクション分離レベルを SERIALIZABLE または SNAPSHOT に設定します。詳細については、こちらを確認してください。

于 2012-11-02T10:43:34.953 に答える
-1

この問題は、同時に選択を実行しているユーザーによって引き起こされる可能性が高くなります。デフォルトの分離レベルは「読み取りコミット」で、ロックが発生します。

読み取っているデータが最新であることが重要でない限り、次の使用を検討してください。

with(nolock)

選択または代替の分離レベルで。

于 2012-11-02T10:47:23.563 に答える