Bitte helfen Sie mir, den Anwendungsfall dahinter zu verstehen SELECT ... FOR UPDATE
.
Frage 1 : Ist das Folgende ein gutes Beispiel dafür, wann SELECT ... FOR UPDATE
es verwendet werden sollte?
Gegeben:
- Zimmer [id]
- Tags [ID, Name]
- room_tags [room_id, tag_id]
- room_id und tag_id sind Fremdschlüssel
Die Anwendung möchte alle Räume und ihre Tags auflisten, muss jedoch zwischen Räumen ohne Tags und Räumen unterscheiden, die entfernt wurden. Wenn SELECT ... FOR UPDATE nicht verwendet wird, kann Folgendes passieren:
- Anfänglich:
- Zimmer enthält
[id = 1]
- Tags enthält
[id = 1, name = 'cats']
- room_tags enthält
[room_id = 1, tag_id = 1]
- Zimmer enthält
- Thread 1:
SELECT id FROM rooms;
returns [id = 1]
- Thread 2:
DELETE FROM room_tags WHERE room_id = 1;
- Thread 2:
DELETE FROM rooms WHERE id = 1;
- Thread 2: [schreibt die Transaktion fest]
- Thread 1:
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;
- gibt eine leere Liste zurück
Jetzt denkt Thread 1, dass Raum 1 keine Tags hat, aber in Wirklichkeit wurde der Raum entfernt. Um dieses Problem zu lösen, sollte Thread 1 verwendet werden SELECT id FROM rooms FOR UPDATE
, wodurch verhindert wird, dass Thread 2 gelöscht wird, rooms
bis Thread 1 fertig ist. Ist das korrekt?
Frage 2 : Wann sollte man verwenden SERIALIZABLE
Transaktion Isolation gegenüber READ_COMMITTED
mit SELECT ... FOR UPDATE
?
Es wird erwartet, dass die Antworten portabel sind (nicht datenbankspezifisch). Wenn dies nicht möglich ist, erklären Sie bitte warum.
REPEATABLE_READ
und READ_COMMITTED
sogar tragbare Optionen? Die einzigen Ergebnisse, die ich für diese bekomme, sind für MSSQL Server
READ COMMITTED
Modus beispielsweise nicht definiert wird, ob tatsächlich Datensätze angezeigt werden, die von einer anderen Transaktion festgeschrieben wurden. Es wird lediglich sichergestellt, dass niemals nicht festgeschriebene Datensätze angezeigt werden.
select ... for update
auf rooms
erlauben noch room_tags
gelöscht werden , weil sie getrennte Tabellen sind. Wollten Sie fragen, ob die for update
Klausel Löschungen verhindert rooms
?