Per favore aiutami a capire il caso d'uso dietro SELECT ... FOR UPDATE
.Quando utilizzare SELECT ... FOR UPDATE?
Domanda 1: Il seguente è un buon esempio di quando è necessario utilizzare SELECT ... FOR UPDATE
?
Attribuite:
- camere [id]
- tag [id, nome]
- room_tags [room_id, tag_id]
- room_id e tag_id sono le chiavi esterne
L'applicazione desidera elencare tutte le stanze e i relativi tag, ma deve distinguere tra stanze senza tag e stanze rimosse. Se SELECT ... FOR UPDATE non viene utilizzato, ciò che potrebbe accadere è:
- Inizialmente:
- camere contiene
[id = 1]
- tag contiene
[id = 1, name = 'cats']
- room_tags contiene
[room_id = 1, tag_id = 1]
- camere contiene
- Thread 1:
SELECT id FROM rooms;
returns [id = 1]
- filettatura 2:
DELETE FROM room_tags WHERE room_id = 1;
- filettatura 2:
DELETE FROM rooms WHERE id = 1;
- filettatura 2: [commit della transazione]
- filettatura 1:
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;
- restituisce una lista vuota
Ora Thread 1 ritiene che la stanza 1 non abbia tag, ma in realtà la stanza è stata rimossa. Per risolvere questo problema, Thread 1 dovrebbe SELECT id FROM rooms FOR UPDATE
, impedendo in tal modo Thread 2 dall'eliminazione da rooms
fino all'applicazione Thread 1. È corretto?
Domanda 2: Quando si dovrebbe usare SERIALIZABLE
isolamento delle transazioni rispetto READ_COMMITTED
con SELECT ... FOR UPDATE
?
Le risposte dovrebbero essere portatili (non specifiche del database). Se ciò non è possibile, ti preghiamo di spiegarne il motivo.
Quali RDBMS stai utilizzando? – Quassnoi
@Quassnoi, come menzionato in fondo alla domanda, sto cercando una soluzione portatile (non specifica per database). – Gili
Le opzioni 'REPEATABLE_READ' e' READ_COMMITTED' sono anche opzioni portatili? Gli unici risultati che ottengo per quelli sono per il server MSSQL –