Per favore aiutami a capire il caso d'uso dietro SELECT ... FOR UPDATE.
Domanda 1 : il seguente è un buon esempio di quando SELECT ... FOR UPDATEdovrebbe essere usato?
Dato:
- camere [id]
- tag [id, nome]
- room_tags [room_id, tag_id]
- room_id e tag_id sono chiavi esterne
L'applicazione desidera elencare tutte le stanze virtuali e i relativi tag, ma deve distinguere tra stanze prive di tag e stanze che sono state rimosse. Se SELEZIONA ... PER AGGIORNAMENTO non viene utilizzato, ciò che potrebbe accadere è:
- inizialmente:
- stanze contiene
[id = 1] - tag contiene
[id = 1, name = 'cats'] - room_tags contiene
[room_id = 1, tag_id = 1]
- stanze contiene
- Discussione 1:
SELECT id FROM rooms;returns [id = 1]
- Discussione 2:
DELETE FROM room_tags WHERE room_id = 1; - Discussione 2:
DELETE FROM rooms WHERE id = 1; - Thread 2: [esegue il commit della transazione]
- Discussione 1:
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;- restituisce un elenco vuoto
Ora il thread 1 pensa che la stanza 1 non abbia tag, ma in realtà la stanza è stata rimossa. Per risolvere questo problema, il thread 1 dovrebbe SELECT id FROM rooms FOR UPDATE, impedendo così l'eliminazione del thread 2 roomsfino al termine del thread 1. È corretto?
Domanda 2 : quando si dovrebbe utilizzare SERIALIZABLEl'isolamento delle transazioni rispetto a READ_COMMITTEDcon SELECT ... FOR UPDATE?
Le risposte dovrebbero essere portabili (non specifiche del database). Se non è possibile, spiega perché.
REPEATABLE_READe READ_COMMITTEDanche le opzioni portatili? Gli unici risultati che ottengo per quelli sono per il server MSSQL
READ COMMITTEDmodalità non definisce se si vedranno effettivamente o meno i record salvati da un'altra transazione: si assicura solo che non si vedranno mai i record non salvati.
select ... for updateon roomsconsentirà comunque room_tagsdi essere cancellato perché sono tabelle separate. Volevi chiedere se la for updateclausola impedirà le cancellazioni da rooms?