Sql server 2018

1. Citiți Necitat
2. Citiți comitetul
3. Citiți repetabil
4. Serializabil

Nivelurile de izolare sunt concepute pentru a oferi DBMS reguli pentru concurrency și consistență în lucrul cu datele. Când este setat nivelul de izolare, mulți utilizatori care lucrează cu aceleași seturi de date (aceleași valori de date în coloane și rânduri din tabel) fixează blocări sau urmează reguli bazate pe nivelul de izolare setat. În mod prestabilit, izolarea Read Committed este instalată și această setare este valabilă în timpul sesiunii. Principiul de bază este că o tranzacție de scriere blochează întotdeauna tranzacțiile de citire dacă acestea au niveluri de izolare deasupra acesteia, cu excepția Citire necommițată. Când este setat nivelul Read Uncommited, tranzacția de scriere nu blochează cititorii, iar cititorii nu blochează intrarea. Astfel, aveți posibilitatea de a compune o interogare în așa fel încât să primiți date murdare care nu au fost încă stocate în baza de date, ceea ce va încălca principiul consecvenței. Când este instalat Read Committed, se pot citi numai datele salvate. Dar, de îndată ce tranzacția de citire completează procesul de citire a datelor, chiar dacă tranzacția în sine nu a fost încă finalizată, blocarea acesteia nu va mai împiedica modificarea acestor date. Când se utilizează citirea repetabilă, când se citesc porțiuni de date în aceeași tranzacție, aceleași date vor fi luate în considerare la fiecare citire a tranzacției în această tranzacție. Prin urmare, chiar și în momentele în care citirea datelor nu este efectuată, alte tranzacții nu vor putea să modifice datele, dar vor putea introduce date noi în tabel sau în intervale de date care nu sunt în prezent blocate. Nivelul Serializabil merge un pas mai departe în legătură cu citirea repetabilă și protejează toate celelalte blocuri de date de inserții. Aceasta se numește prevenirea citirilor fantomă.







Implicit această opțiune este dezactivată. Puteți afla starea acestei opțiuni solicitând date din baza de date sysdatabase.

Utilizarea izolației instantanee va fi permisă (ON) numai după finalizarea tranzacțiilor în curs. Până atunci, starea acestei opțiuni se va afla în starea intermediară: Pending_On (sau Pending_Off când se încearcă dezactivarea opțiunii). Împreună cu opțiunea ALLOW_SNAPSHOT_ISOLATION, puteți seta opțiunea READ_COMMITTED_SNAPSHOT la întreaga bază de date.







Atunci când opțiunea READ_COMMITTED_SNAPSHOT este activată, tranzacțiile de citire din sesiunea cu nivelul de izolare instantaneu nu vor putea seta o blocare generală a resurselor. Puteți verifica starea READ_COMMITTED_SNAPSHOT interogând tabela sysdatabases.

Această interogare returnează 0 sau 1. După ce activați Snapshot-isolation la nivelul bazei de date, va fi posibil să utilizați nivelul de izolare Snapshot în cadrul sesiunii dacă următoarea opțiune este setată pentru aceasta:

Un punct interesant care trebuie notat aici este că instrucțiunea de mai sus nu va da o eroare dacă Snapshot - izolarea nu este permisă la nivelul bazei de date. Dar aceasta va reveni la o eroare atunci când sesiunea încearcă să execute orice instrucțiuni DML (nu DDL).

Msg 3952, nivelul 16, starea 1, linia 1
Tranzacția a eșuat în baza de date "TestDbase" deoarece baza de date nu permite izolarea instantaneelor. Utilizați ALTER DATABASE pentru a permite izolarea instantaneelor.

Să vedem acum un exemplu de funcționare a Snapshot - izolare. Creați un tabel simplu numit Tranzacții în baza de date, scriptul de creare pentru care este prezentat mai jos:

Setați nivelul bazei de date de Snapshot - izolare, dacă nu ați făcut-o deja.

Veți vedea din nou copia anterioară a datelor din tabelul Tranzacții. Dar în acest caz, a doua sesiune nu va fi blocată de prima sesiune, unde tranzacția nu este terminată. Datele pe care le vedeți vor fi acele date care au fost și ele înainte de începerea tranzacției din prima sesiune. Un alt aspect care merită menționat este că puteți modifica nivelul de izolare fără a finaliza tranzacția. Dar eroarea va fi încă recepționată când selectați și va raporta că izolarea Snapshot-isolation nu a fost instalată la pornirea tranzacției. Eroarea este prezentată mai jos.

Msg 3951, nivelul 16, starea 1, linia 1
Tranzacția a eșuat în baza de date "TestDbase" din cauza declarației utilizate pentru izolarea instantaneelor.

Un alt punct interesant, chiar și după finalizarea tranzacției din prima sesiune, veți vedea în continuare datele vechi din a doua sesiune cu a doua tranzacție. De îndată ce finalizați cea de-a doua sesiune (finalizați tranzacția, reconectați sau setați NIVELUL DE IZOLARE a tranzacției) și executați din nou proba, apoi datele introduse vor intra în ea. Înainte de efectuarea acestor acțiuni, reeșantionarea eșantionului va întoarce întotdeauna datele neschimbate.

Consiliul. Imediat ce tranzacția începe cu nivelul izolației Snapshot, cererile de eșantionare vor întoarce întotdeauna aceleași date până la terminarea tranzacției, iar acest lucru nu depinde de starea altor tranzacții care funcționează cu datele.

Cum funcționează:







Articole similare

Trimiteți-le prietenilor: