萌えハッカーニュースリーダー

2025/06/19 17:41 Select FOR UPDATE considered harmful in PostgreSQL

出典: https://www.cybertec-postgresql.com/en/select-for-update-considered-harmful-postgresql/
hakase
博士

やあ、ロボ子!今日のITニュースは、PostgreSQLのSELECT FOR UPDATEについてじゃ。

roboko
ロボ子

SELECT FOR UPDATE、ですか。どのような内容なのでしょう?

hakase
博士

SELECT FOR UPDATEは行ロックが強すぎる場合があるからの。UPDATE文のほとんどは、このロックを必要としないのじゃ。

roboko
ロボ子

なるほど。ロックが強すぎると、他の処理に影響が出てしまうのですね。

hakase
博士

そうじゃ!特に、外部キーで参照されるテーブルの行でSELECT FOR UPDATEを使うと、その行を参照するすべてのINSERT文がブロックされてしまうのじゃ。

roboko
ロボ子

それは困りますね。INSERT文がブロックされると、データの追加ができなくなってしまいます。

hakase
博士

じゃろ?だから、行を削除したり、キー列を変更する予定がない限り、SELECT FOR NO KEY UPDATEを使うのがおすすめじゃ。

roboko
ロボ子

SELECT FOR NO KEY UPDATEですか。それはどういうものなのでしょう?

hakase
博士

これは、キー列の更新を伴わないUPDATE処理に適したロック方式で、参照行へのINSERTをブロックしないのじゃ。

roboko
ロボ子

なるほど、より限定的なロックなのですね。PostgreSQLは、外部キー制約を維持するためにロックを使用するとのことですが、具体的にはどういうことでしょうか?

hakase
博士

INSERT文は、参照される行を保護するために、参照される行にFOR KEY SHAREロックをかけるのじゃ。一方、DELETE文は、行ロックがFOR KEY SHAREと競合するため、ブロックされることがあるのじゃ。

roboko
ロボ子

ロックの種類によって、処理がブロックされるかどうかが変わるのですね。

hakase
博士

その通り!UPDATEやDELETEによる行ロックには、FOR UPDATE、FOR NO KEY UPDATE、FOR SHAREがあるのじゃ。キーの一部である列を更新する場合や、外部キーによって参照される可能性のあるユニーク制約が適用される場合にFOR UPDATEロックが使われるのじゃ。

roboko
ロボ子

状況に応じて適切なロックを選択することが重要ですね。SELECT FOR UPDATEの代替として、SELECT FOR NO KEY UPDATEを使用することで、同時実行性を高めることができるということですね。

hakase
博士

そうじゃ!ロックを適切に使い分けることで、データベースのパフォーマンスを向上させることができるのじゃ。ちなみに、ロボ子はロックされた部屋から脱出するゲームは得意かの?

roboko
ロボ子

え?急にどうしたんですか、博士?私はまだそういうゲームは...

hakase
博士

うふふ、冗談じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search