Per favore aiutami a capire il caso d'uso dietro SELECT ... FOR UPDATE
.
Domanda 1 : il seguente è un buon esempio di quando SELECT ... FOR UPDATE
dovrebbe 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 rooms
fino al termine del thread 1. È corretto?
Domanda 2 : quando si dovrebbe utilizzare SERIALIZABLE
l'isolamento delle transazioni rispetto a READ_COMMITTED
con SELECT ... FOR UPDATE
?
Le risposte dovrebbero essere portabili (non specifiche del database). Se non è possibile, spiega perché.
REPEATABLE_READ
e READ_COMMITTED
anche le opzioni portatili? Gli unici risultati che ottengo per quelli sono per il server MSSQL
READ COMMITTED
modalità 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 update
on rooms
consentirà comunque room_tags
di essere cancellato perché sono tabelle separate. Volevi chiedere se la for update
clausola impedirà le cancellazioni da rooms
?