Wann sollte SELECT ... FOR UPDATE verwendet werden?
Bitte helfen Sie mir, den Anwendungsfall dahinter zu verstehenSELECT ... FOR UPDATE
.
Frage 1: Ist das folgende ein gutes Beispiel für wannSELECT ... FOR UPDATE
sollte benutzt werden?
Gegeben:
zimmer [id]Tags [ID, Name]room_tags [room_id, tag_id]room_id und tag_id sind FremdschlüsselDie Anwendung möchte alle Räume und ihre Tags auflisten, muss jedoch zwischen Räumen ohne Tags und Räumen, die entfernt wurden, unterscheiden. 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]
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ückJetzt denkt Thread 1, dass Raum 1 keine Tags hat, aber in Wirklichkeit wurde der Raum entfernt. Um dieses Problem zu lösen, sollte Thread 1SELECT id FROM rooms FOR UPDATE
Dadurch wird verhindert, dass Thread 2 von gelöscht wirdrooms
bis Thread 1 fertig ist. Ist das korrekt?
Frage 2: Wann sollte man verwendenSERIALIZABLE
Transaktionsisolation versusREAD_COMMITTED
mitSELECT ... FOR UPDATE
?
Es wird erwartet, dass Antworten portierbar sind (nicht datenbankspezifisch). Wenn dies nicht möglich ist, erklären Sie bitte warum.