Tutto dipende dal ISOLATION LEVEL
hai impostato.
Puoi vedere quale hai impostato con questa query:
select @@global.tx_isolation, @@session.tx_isolation;
Prima di spiegare i diversi livelli di isolamento, lascia che ti spieghi quali problemi stanno cercando di evitare:
-
La lettura sporca :I dati di una transazione non ancora terminata vengono letti da un'altra transazione.
-
L'aggiornamento perso :due transazioni modificano una voce in una tabella in parallelo. Al termine di entrambe le transazioni, viene applicata una sola modifica.
-
La lettura non ripetibile :le letture ricorrenti portano a risultati diversi.
-
La lettura fantasma :durante una transazione un'altra transazione aggiunge o rimuove voci di tabella.
Ora per i diversi livelli di isolamento.
Leggi senza impegno :
Con questo livello di isolamento le operazioni di lettura ignorano qualsiasi tipo di blocco, quindi può verificarsi uno qualsiasi dei problemi sopra menzionati.
Lettura Impegnata :
Questo livello di isolamento imposta un blocco di scrittura per l'intera transazione sugli oggetti che devono essere modificati. I blocchi di lettura vengono impostati solo durante la lettura dei dati. Pertanto possono verificarsi letture non ripetibili e letture fantasma.
Lettura ripetibile :
Con questo livello di isolamento è garantito che le operazioni di lettura ricorrenti producano sempre lo stesso risultato quando i parametri sono gli stessi. I blocchi sono impostati per le operazioni di lettura e scrittura per la durata totale della transazione. Pertanto possono verificarsi solo letture fantasma.
Serializzabile :
Il livello di isolamento più elevato garantisce che il risultato delle transazioni in esecuzione parallela sia lo stesso come se le transazioni venissero eseguite una dopo l'altra. La maggior parte dei database in realtà non esegue quelle transazioni una dopo l'altra, sarebbe una perdita di prestazioni eccessiva. Pertanto può accadere che una transazione venga interrotta. MySQL, ad esempio, lo realizza con MVCC (Multi-Version Concurrency Control). Cercalo su Google, se vuoi saperne di più. È troppo per questa risposta.
Tutto sommato lo spiega anche questa tabella:
| Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible | possible | possible | possible
Read Committed | impossible | impossible | possible | possible
Repeatable Read | impossible | impossible | impossible | possible
Serializable | impossible | impossible | impossible | impossible
- In questa immissione del manuale c'è qualche informazione in più a riguardo e su come impostare il livello di isolamento.
Tutto questo è solo teoria per i sistemi di gestione di database relazionali. Poiché MySQL utilizza MVCC (controllo della concorrenza multiversione), non si verificano letture fantasma quando si utilizza InnoDB e il livello di isolamento della lettura ripetibile .
Da manuale
: