2016-04-22 8 views
-1

私はいくつかの行を選択し、後でそれを更新する必要があるテーブルがあります。行の選択と更新の間に、別のセッションでデータを更新できるようにしたいので、このシナリオで繰り返し可能な読み取りを使用しています。 しかし、デッドロックが発生し始めました。今私はデッドロックを避けるために、私はロックヒントを追加することを考えている - 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が「トランザクション分離レベルの反復可能読み取りを設定」で始まる場合は、依然としてデッドロックまたはブロッキングが発生します。私はひどく混乱している。あなたの状況を例よりも複雑ではありません、あなたはこれをやってみたと仮定すると

答えて

0

は1文です...

UPDATE abc SET active_site_status = ? WHERE new_site_id = (SELECT new_site_id FROM abc) 

あなたのケースはより複雑である場合には、実際のコードを投稿してください。