Il livello di isolamento delle transazioni in SQL Server e la loro relazione con dirty read, reads non ripetibili, phantom read, ecc. (argomenti di codice e sequenze temporali)
Comprendendo questi problemi che possono sorgere nel caso di accesso concorrente al database, possiamo continuare a comprendere il concetto di livello di isolamento del database, in termini semplici: come si vuole isolare le transazioni concorrenti e in che misura? Ad esempio, se le letture sporche possono essere tollerate, o se non vuoi che le transazioni concorrenti abbiano letture sporche, queste possono essere impostate al livello di isolamento per rendere l'isolamento tra transazioni concorrenti morbido o grave.
Più alto è il livello di isolamento, minore è la probabilità di leggere dati sporchi o incompleti, ma maggiore è la degradazione delle prestazioni nei sistemi ad alta concorrenza. Più basso è il livello di isolamento, maggiore è il miglioramento delle prestazioni nel sistema concorrente, ma i dati stessi possono essere incompleti.
In SQL Server 2012, puoi impostare il livello di isolamento di una transazione (da basso a alto) usando questa sintassi:
IMPOSTA IL LIVELLO DI ISOLAMENTO DELLE TRANSAZIONI { LEGGI NON DICHIARATO | LEGGI IMPEGNATO | LETTURA RIPETIBILE | ISTANTANEO | SERIALIZZABILE } [ ; ] Per prima cosa, crea un nuovo script di test, crea un database e inserisci i dati di test, come segue:
Crea una nuova finestra A, apri una transazione, esegui l'operazione di aggiornamento e attendi 10 secondi prima di effettuare il commesso, il codice è il seguente:
Crea una nuova finestra B, imposta la transazione READ UNCOMMITTED (read uncommess, il livello più basso, il problema facile è la lettura sporca, perché può leggere i dati modificati da altre transazioni ma non essere stati commessi.) Fa la stessa cosa che impostare (NOLOCK) sulla tabella dell'oggetto dell'istruzione SELECT in una transazione. Interroga i dati, il codice è il seguente:
Crea una nuova finestra C, interroga direttamente i dati, come segue:
A sua volta,Esegui le finestre A, B e C e scopri che durante l'aggiornamento dei dati, la finestra B può restituire immediatamente i dati (È possibile che la lettura sia un dato sporco), la finestra C deve aspettare che la finestra A finisca di essere eseguitarestituirà i dati, come mostrato nella figura sottostante:
(Finestra B)
(Finestra C)
(Fine)
|