Dacă aveți un SQL Server normal (nu Azure), atunci implicit aveți nivelul de izolare READ COMMITTED. Cum funcționează această actualizare?
- UI - blocarea actualizării intenției este setată în tabel. Aceasta înseamnă că procesul dvs. va găsi rândurile din acest tabel care trebuie actualizate.
- Începeți să mutați liniile în căutarea celor care trebuie actualizate. Înainte de a verifica dacă este utilă actualizarea liniei, aceasta este setată la blocarea U.
- De îndată ce se găsește prima linie pentru actualizare, pe masa este instalată închiderea IX. Procesul dvs. de fapt va actualiza datele.
- Pe o anumită linie, X lock este instalat.
- instalarea blocărilor U și X continuă pentru toate rândurile, ceea ce duce la instalarea blocărilor X pe fiecare rând actualizat.
Astfel, din momentul în care găsește cel puțin o intrare pentru actualizare și înainte de tranzacția este finalizată (până la sfârșitul update) pe toate rândurile actualizate atârnă X-Loka.
În același timp, se execută SELECT:
- Tabelul stabilește blocarea IS - intenția partajată
- Blocarea S este instalată pe toate șirurile selectabile.
Problema este că blochează pravialam S compatibilitatea de blocare nu poate fi pus pe linie, care se află deja de blocare X. De fapt, aceasta este esența CITIRE nivel de izolare SĂVÂRȘITE - blocare X înseamnă că datele sunt modificate de un alt proces, dar modificările nu au fost încă vkommitany - și acest lucru, deoarece acestea nu pot fi citite.
Astfel, dacă aveți o mulțime de date actualizate (întregul tabel, nici în cazul în care) sau actualizate procesul de căutare a datelor durează o perioadă lungă de timp (în cazul în care clauza este acolo, dar de indicele / statistici / dificil - este de a vedea un plan!) - care, la momentul actualizării, toate agățat încetinește și cade la expirare.
Puteți obține această restricție enervantă prin includerea izolației instantaneului și înlocuirea READ COMMITTED cu READ_COMMITTED_SNAPSHOT.
În READ_COMMITTED_SNAPSHOT, SELECT va selecta date din propria copie și nu va pune blocările S pe șiruri de caractere. În consecință, nu se va împiedica să instaleze încuietori S pe încuietoarele X ale altor persoane și nu le va aștepta.
Pe SQL Azure, READ_COMMITTED_SNAPSHOT este activat în mod implicit și nu poate fi dezactivat.