Nivelul de izolare al tranzacțiilor în SQL Server și relația lor cu citirile murdare, citirile nerepetabile, citirile fantomă etc. (argumente de cod și secvențe de timp)
Înțelegând aceste probleme care pot apărea în cazul accesului concurent la baza de date, putem continua să înțelegem conceptul de nivel de izolare a bazei de date, în termeni simpli: cum doriți să izolați tranzacțiile concurente și în ce măsură? De exemplu, dacă citirile murdare pot fi tolerate sau dacă nu vrei ca tranzacțiile concurente să aibă citiri murdare, atunci acestea pot fi setate la nivelul de izolare pentru a face izolarea dintre tranzacțiile concurente slăbită sau severă.
Cu cât nivelul de izolare este mai ridicat, cu atât mai puține șanse de a citi date murdare sau date incomplete, dar degradarea performanței este mai severă în sistemele cu concurență mare. Cu cât nivelul de izolare este mai mic, cu atât îmbunătățirea performanței în sistemul concurent este mai mare, dar datele în sine pot fi incomplete.
În SQL Server 2012, poți seta nivelul de izolare al unei tranzacții (de la mic la mare) folosind această sintaxă:
SETEAZĂ NIVELUL DE IZOLARE AL TRANZACȚIILOR { CITEȘTE NEANGAJAT | CITEȘTE ANGAJAT | LECTURĂ REPETABILĂ | INSTANTANEE | SERIALIZABIL } [ ; ] Mai întâi, creează un nou script de testare, creează o bază de date și inserează datele de test, astfel:
Creează o fereastră nouă A, deschide o tranzacție, efectuează operația de actualizare și așteaptă 10 secunde înainte de a face commit, codul este următorul:
Creează o fereastră nouă B, setează tranzacția READ UNCOMMITTED (citire neangajată, cel mai jos nivel, problema ușoară este citirea murdară, deoarece poate citi datele modificate de alte tranzacții, dar care nu sunt commite.) Face același lucru ca setarea (NOLOCK) pe tabelul obiectelor instrucțiunii SELECT într-o tranzacție. Interogând datele, codul este următorul:
Creează o fereastră nouă C, interogă direct datele, după cum urmează:
La rândul său,Executați ferestrele A, B și C și constatați că la actualizarea datelor, fereastra B poate returna imediat date (Este posibil ca citirea să fie date murdare), fereastra C trebuie să aștepte ca fereastra A să se termine de executatva returna datele, așa cum se arată în figura de mai jos:
(Fereastra B)
(fereastra C)
(Sfârșit)
|