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üssel

Die 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ü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 1SELECT id FROM rooms FOR UPDATEDadurch 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage