私はいくつかの行を選択し、後でそれを更新する必要があるテーブルがあります。行の選択と更新の間に、別のセッションでデータを更新できるようにしたいので、このシナリオで繰り返し可能な読み取りを使用しています。 しかし、デッドロックが発生し始めました。今私はデッドロックを避けるために、私はロックヒントを追加することを考えている - UPDLOCKのように以下に述べる。マルチスレッドで選択と更新ステートメントのためにデッドロックを解決する方法
-------------session 1-----------
set transaction isolation level repeatable read
begin transaction
Select new_site_id from abc with (updlock)
update abc set active_site_status = ? where new_site_id = ?
commit transaction
ここで、UPDLOCKヒントは、別のUPDLOCKまたは更新ステートメントと互換性がありません。しかし、共有ロックと互換性があります。このソリューションは、別のセッションで以下のコードを実行すると失敗します。 -
-------------session 2-----------
set transaction isolation level repeatable read
begin transaction
Select new_site_id from abc --This is without updlock
update abc set active_site_status = ? where new_site_id = ?
commit transaction
この場合、デッドロックを回避するにはどうすればよいですか。すべてのオプションはここにあります。 スナップショットの隔離は役に立ちますか?私が「トランザクション分離レベルスナップショットを設定」で始まり、セッション2が「トランザクション分離レベルの反復可能読み取りを設定」で始まる場合は、依然としてデッドロックまたはブロッキングが発生します。私はひどく混乱している。あなたの状況を例よりも複雑ではありません、あなたはこれをやってみたと仮定すると