Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Differenza tra lettura confermata e lettura ripetibile

Read committed è un livello di isolamento che garantisce che tutti i dati letti siano stati impegnati al momento viene letto. Impedisce semplicemente al lettore di vedere qualsiasi lettura intermedia, non impegnata e "sporca". Non fa alcuna promessa che se la transazione riemette la lettura, troverà lo stesso dati, i dati sono liberi di cambiare dopo essere stati letti.

La lettura ripetibile è un livello di isolamento più elevato, che oltre alle garanzie del livello di lettura commit, garantisce anche che tutti i dati letti non possano cambiare , se la transazione legge nuovamente gli stessi dati, troverà i dati precedentemente letti in posizione, invariati e disponibili per la lettura.

Il livello di isolamento successivo, serializzabile, fornisce una garanzia ancora più forte:oltre a tutte le garanzie di lettura ripetibili, garantisce anche che nessun nuovo dati può essere visto da una lettura successiva.

Supponiamo di avere una tabella T con una colonna C con una riga al suo interno, supponiamo che abbia il valore '1'. E considera di avere un compito semplice come il seguente:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

Questo è un compito semplice che emette due letture dalla tabella T, con un ritardo di 1 minuto tra di loro.

  • sotto READ COMMITTED, il secondo SELECT può restituire qualsiasi dati. Una transazione simultanea può aggiornare il record, eliminarlo, inserire nuovi record. La seconda selezione vedrà sempre il nuovo dati.
  • sotto REPEATABLE READ è garantito che il secondo SELECT visualizzi almeno le righe che sono state restituite dal primo SELECT invariato . Nuove righe possono essere aggiunte da una transazione simultanea in quel minuto, ma le righe esistenti non possono essere eliminate né modificate.
  • sotto SERIALIZABLE legge la seconda selezione è garantita per vedere esattamente le stesse righe della prima. Nessuna riga può essere modificata, né cancellata, né nuove righe possono essere inserite da una transazione simultanea.

Se segui la logica sopra puoi renderti subito conto che le transazioni SERIALIZABLE, sebbene possano semplificarti la vita, sono sempre completamente bloccate ogni possibile operazione simultanea, poiché richiedono che nessuno possa modificare, cancellare o inserire alcuna riga. Il livello di isolamento delle transazioni predefinito di .Net System.Transactions l'ambito è serializzabile e questo di solito spiega le pessime prestazioni che ne derivano.

E infine, c'è anche il livello di isolamento SNAPSHOT. Il livello di isolamento SNAPSHOT rende le stesse garanzie serializzabili, ma non richiedendo che nessuna transazione simultanea possa modificare i dati. Invece, costringe ogni lettore a vedere la propria versione del mondo (è la propria 'istantanea'). Ciò lo rende molto facile da programmare e molto scalabile in quanto non blocca gli aggiornamenti simultanei. Tuttavia, questo vantaggio ha un prezzo:consumo aggiuntivo di risorse del server.

Letture supplementari:

  • Livelli di isolamento nel Motore di database
  • Effetti della concorrenza
  • Scelta dei livelli di isolamento basati sul controllo delle versioni delle righe