sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2005 と C# アプリケーションでデッドロックを解消するにはどうすればよいですか?

    コードに明示的なトランザクション スコープが表示されないため、更新を行っているときに既にどのロックが設定されているかわかりません。また、使用している分離レベルも明確ではありません。ただし、このタイプの状況で最も一般的なシナリオは、同じトランザクションの早い段階で、後で更新しようとしている同じ行に対して選択 (読み取りロック) を発行したことです。これによりロックのエスカレーションが発生し、2 つのトランザクションが同じことを行おうとするとデッドロックが発生する可能性があります:

    <オール>
  1. トランザクション A:読み取りロックで選択
  2. トランザクション B:readlock で選択
  3. トランザクション A:更新 - 読み取りロックを書き込みロックにエスカレートしたいが、トランザクション B が読み取りロックを解放するのを待たなければならない
  4. トランザクション B:更新 - 読み取りロックを書き込みロックにエスカレートしようとしていますが、トランザクション A が読み取りロックを解放するのを待つ必要があります。
  5. ビンゴ! A と B の両方が、更新を行う前に既存の読み取りロックを解放するのを互いに待機しているため、デッドロックが発生します。

    これを防ぐには、select に updlock のヒントが必要です。たとえば、

    select * from table with (updlock) where blah blah
    

    これにより、select が読み取りロックではなく書き込みロックを使用するようになり、同時トランザクション間のロックのエスカレーションが防止されます。



    1. 1行目の''付近の不思議なMySQLエラー

    2. ユーザー、スレッド、投稿を管理するための基本的なデータ構造のモデリング

    3. 制約を変更する方法

    4. SQL ServerのSleep()と同等:WAITFORステートメント