2016-08-22 1 views
3

は現在、我々はこの文を使用して、同時に多数の行を更新している:ポストグルで "IN()"を使って多くの行を更新すると、デッドロックが発生する可能性はありますか?

update my_table set field = 'value' where id in (<insert ids here>); 

私の心配は、それは我々が時間間隔で実行する別のクエリでデッドロックが発生する可能性があり、次のとおりです。

select my_table where field = 'value' for update order by id; 

上記のクエリは複数の行を取得します。

このシナリオは可能ですか?背景の

だけビット:

私たちは、同時に複数回上記のクエリを実行すると、私たちはそのクエリによって異なる順序に起因するランダムなデッドロックを持ったので、私たちは前にidで順番を追加しました。

これが更新ステートメントにも当てはまるかどうかは疑問でした。

答えて

3

はい、デッドロックする可能性があります。これを回避するには、更新の直前に同じトランザクション内でselect ... for update order by idを実行します。これにより、影響を受けるすべての行がロックされ、他のトランザクションで同じselect ... for updateクエリが実行されることはありません。

私は同じ2つのタスクを統合すると言っているわけではありません。私は両方で同じロッキング選択を使用すると言っています。

関連する問題