背後にあるユースケースを理解するのを手伝ってください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
があります。あれは正しいですか?
質問2:SERIALIZABLE
トランザクション分離READ_COMMITTED
を使用するのはSELECT ... FOR UPDATE
いつですか?
回答は移植可能であることが期待されます(データベース固有ではありません)。それが不可能な場合は、その理由を説明してください。