コードに明示的なトランザクション スコープが表示されないため、更新を行っているときに既にどのロックが設定されているかわかりません。また、使用している分離レベルも明確ではありません。ただし、このタイプの状況で最も一般的なシナリオは、同じトランザクションの早い段階で、後で更新しようとしている同じ行に対して選択 (読み取りロック) を発行したことです。これによりロックのエスカレーションが発生し、2 つのトランザクションが同じことを行おうとするとデッドロックが発生する可能性があります:
<オール>ビンゴ! A と B の両方が、更新を行う前に既存の読み取りロックを解放するのを互いに待機しているため、デッドロックが発生します。
これを防ぐには、select に updlock のヒントが必要です。たとえば、
select * from table with (updlock) where blah blah
これにより、select が読み取りロックではなく書き込みロックを使用するようになり、同時トランザクション間のロックのエスカレーションが防止されます。