Descrieți consecvența

Finalizat

O caracteristică de bază a bazelor de date cu mai multe entități este concurentă. Blocarea și blocarea utilizează blocarea pentru a permite datelor să rămână unitare cu mulți utilizatori care actualizează și citesc date în același timp. De exemplu, din cauza costurilor de expediere, toate produsele noastre au o creștere de 5 lei. În același timp, din cauza ratelor valutare, toate produsele au o scădere a prețului de 3%. Dacă aceste actualizări apar exact în același timp, prețul final va fi variabil și este posibil să existe multe erori. Utilizând blocarea, vă puteți asigura că o actualizare se va finaliza înainte ca cealaltă să înceapă.

Intercurrency are loc la nivelul tranzacției. O tranzacție de scriere poate bloca actualizarea și chiar citirea acelorași date. În mod egal, o tranzacție de citire poate bloca alți cititori sau chiar unii scriitori. Din acest motiv, este important să evitați tranzacțiile inutile lungi sau tranzacțiile care acoperă volume excesive de date.

Există multe niveluri specifice de izolare a tranzacțiilor care pot fi utilizate pentru a defini modul în care un sistem de baze de date gestionează mai mulți utilizatori. În scopul acestui modul, vom analiza categorii largi de nivel de izolare, blocare optimistă și blocare pesimistă.

Notă

Detaliile complete ale blocării tranzacției dincolo de concurență sunt legate mai mult de performanță și nu numai de dependența de cod - deși codul bun funcționează mai bine. Pentru mai multe detalii, consultați Ghidul de blocare a tranzacției SQL Server și Ghidul de versiune a rândurilor . Pentru informații despre blocare, consultați și documentația SQL Server Performance.

Concurență optimistă

Cu blocarea optimistă, există o presupunere că vor apărea câteva actualizări conflictuale. La începutul tranzacției, se înregistrează starea inițială a datelor. Înainte de comiterea tranzacției, starea curentă este comparată cu starea inițială. Dacă stările sunt identice, tranzacția este finalizată. Dacă stările sunt diferite, tranzacția este anulată.

De exemplu, aveți un tabel care conține comenzile de vânzări din ultimii ani. Aceste date sunt actualizate rar, dar rapoartele rulează adesea. Prin utilizarea blocării optimiste, tranzacțiile nu se blochează reciproc și sistemul rulează mai eficient. Din păcate, erorile au fost găsite în ultimii ani, iar actualizările trebuie să aibă loc. În timp ce o tranzacție actualizează fiecare rând, o altă tranzacție face o editare minoră la un singur rând în același timp. Deoarece starea datelor s-a modificat în timp ce rulează tranzacția inițială, întreaga tranzacție este readusă la starea inițială.

Concurență pesimistă

Cu blocarea pesimistă, există o presupunere că multe actualizări se întâmplă în același timp cu datele. Prin utilizarea blocărilor, se poate întâmpla o singură actualizare în același timp și citirea datelor este împiedicată în timp ce au loc actualizările. Acest lucru poate împiedica revenirile mari, așa cum se vede în exemplul anterior, dar poate face ca interogările să fie blocate inutil.

Este important să luați în considerare natura datelor și interogările care rulează pe date atunci când decideți dacă să utilizați concurență optimistă sau pesimistă pentru a asigura o performanță optimă.

Izolare instantanee

Există cinci niveluri diferite de izolare în SQL Server, dar pentru acest modul ne vom concentra doar pe READ_COMMITTED_SNAPSHOT_OFF și READ_COMMITTED_SNAPSHOT_ON. READ_COMMITTED_SNAPSHOT_OFF este nivelul de izolare implicit pentru SQL Server. READ_COMMITTED_SNAPSHOT_ON este nivelul de izolare implicit pentru baza de date SQL Azure.

READ_COMMITTED_SNAPSHOT_OFF va menține blocările pe rândurile afectate până la sfârșitul tranzacției, dacă interogarea utilizează nivelul de izolare a tranzacțiilor comise în citire. Deși este posibil ca unele actualizări să aibă loc, cum ar fi crearea unui rând nou, acest lucru va împiedica majoritatea modificărilor conflictuale ale datelor citite sau actualizate. Aceasta este concurență pesimistă.

READ_COMMITTED_SNAPSHOT_ON face un instantaneu al datelor. Actualizările se efectuează apoi pe acel instantaneu, permițând altor conexiuni să interoogeze datele originale. La sfârșitul tranzacției, starea curentă a datelor este comparată cu instantaneul. Dacă datele sunt identice, tranzacția se angajează. Dacă datele diferă, tranzacția este readusă la versiunea anterioară.

Pentru a modifica nivelul de izolare la READ_COMMITTED_SNAPSHOT_ON emite următoarea comandă:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;

Pentru a modifica nivelul de izolare la READ_COMMITTED_SNAPSHOT_OFF emite următoarea comandă:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;

Dacă baza de date a fost modificată pentru a activa instantaneul citit comis, orice tranzacție care utilizează nivelul implicit de izolare validată citire va utiliza blocarea optimistă.

Notă

Izolarea instantaneelor are loc doar pentru tranzacțiile comise în citire. Tranzacțiile care utilizează alte niveluri de izolare nu sunt afectate.