147

背後にあるユースケースを理解するのを手伝ってくださいSELECT ... FOR UPDATE

質問1SELECT ... FOR UPDATE :次はいつ使用すべきかについての良い例ですか?

与えられた:

  • 部屋[id]
  • タグ[ID、名前]
  • room_tags [room_id、tag_id]
    • room_idとtag_idは外部キーです

アプリケーションは、すべての部屋とそのタグを一覧表示する必要がありますが、タグのない部屋と削除された部屋を区別する必要があります。SELECT ... FOR UPDATEが使用されていない場合、次のようになります。

  • 最初は:
    • 部屋に含まれています[id = 1]
    • タグに含まれる[id = 1, name = 'cats']
    • room_tagsには[room_id = 1, tag_id = 1]
  • スレッド1:SELECT id FROM rooms;
    • returns [id = 1]
  • スレッド2:DELETE FROM room_tags WHERE room_id = 1;
  • スレッド2:DELETE FROM rooms WHERE id = 1;
  • スレッド2:[トランザクションをコミットします]
  • スレッド1:SELECT tags.name FROM room_tags, tags WHERE room_tags.room_id = 1 AND tags.id = room_tags.tag_id;
    • 空のリストを返します

これで、スレッド1は部屋1にタグがないと見なしますが、実際には部屋は削除されています。この問題を解決するには、スレッド1を使用して、スレッド1が完了するまでSELECT id FROM rooms FOR UPDATEスレッド2が削除されないようにする必要roomsがあります。あれは正しいですか?

質問2SERIALIZABLEトランザクション分離READ_COMMITTEDを使用するのはSELECT ... FOR UPDATEいつですか?

回答は移植可能であることが期待されます(データベース固有ではありません)。それが不可能な場合は、その理由を説明してください。

4

2 に答える 2