piektdiena, 2010. gada 24. septembris

Izolācijas līmeņi transakcijām

Šajā rakstā aprakstīti SQL Server 2005 transakciju izolācijas līmeņi (isolation level).


Strādājot ar SQL Server jāizvēlas pats zemākais un mazāk resursu prasīgais izolācijas līmenis, lai sasniegtu pašu labāko ātrdarbību. Pēc noklusējuma visas transakcijas notiek „Read Committed” režīmā. [apmēram to pašu kas šajā rakstā rakstīts var izlasīt arī šeit]

READ COMMITTED- (šis ir arī noklusētais transakcijas izolācijas līmenis). Visi pagaidu uzliktie slēgšanas mehānismi tiek noņemti, tiklīdz tiek izpildīts "Select" vaicājums transakcijas ietvaros. Piemēram, ja transakcijā tiek izpildīti divi SQL "Select" vaicājumi, pēc katra no tiem tiek noņemta pazīme, ka rinda(s) šobrīd tiek izmantota. Teorētiski ir iespējami gadījumi, ka pirmais vaicājums atgriež citus datus, kā otrais-gadījumā, ja pa vidu notiek rindas labošana (to izdara cits lietotājs). Izņēmuma gadījums ir tad, ja transakcijas ietvaros tiek mainīti/ievietoti dati. Tādā gadījumā tām rindām pazīme tiek noņemta tikai pēc transakcijas beigšanās.

READ UNCOMMITED- Šis izolācijas līmenis ir pats bīstamākais, tomēr arī pats ātrākais. Šādā gadījumā tiek ignorēti visas uzliktās rindas slēgšanas pazīmes un arī vaicājumi šādas transakcijas iekšienē neuzliek nekādus ierobežojumus. Lai rindām netiktu uzlikti nekādi ierobežojumi, var arī izmantot NOLOCK vaicājuma pazīmi (hint), bet izolācijas līmeņa uzlikšana ir vienkāršāka gadījumā, ja tas jāizmanto vairākām tabulām. Izmantojot šo izolācijas līmeni. Var veikt „netīrus” nolasījumus, kas vairumā gadījumu nav pieļaujams.

REPEATABLE READ- Šī izolācijas līmeņa gadījumā citi lietotāji, kas vēlas mainīt datus, to nevar izdarīt, kamēr transakcija nav beigusies (runa ir par datiem, kas tiek lasīti transakcijas ietvaros). Tas nozīmē, ka, ja transakcijas ietvaros vaicājums izpildās divas reizes, tad abos gadījumos tiks izmantota rinda- tieši tāda pati kā iepriekšējā reizē (atšķirībā no READ COMMITTED). Šī izolācijas līmeņa gadījumā citi lietotāji var ievietot datu bāzē jaunas rindas, kas atbilst šajā transakcijā izpildāmā vaicājuma WHERE daļai. Piemēram, atlasot visus veikala X datus, citi lietotāji nevar mainīt tos datus, kurus atgriež vaicājums, bet var papildināt tabulu ar citiem veikala X datiem. Tas nozīmē, ka otrajā nolasīšanas reizē transakcijas ietvaros, lietotājs nolasīs tieši tos pašus datus, un arī citus papildus datus, kuru vēl nebija pirmajā nolasīšanas reizē.

SERIALIZABLE- Pats nopietnākais no visiem izolācijas līmeņiem. Tāpat kā REPEATABLE READ, šis izolācijas līmenis neļauj mainīt datus, kas tiek nolasīti transakcijas ietvaros, bet papildus tam neļauj papildināt datus ar citiem, ja tie atbilst izpildāmā vaicājuma WHERE daļai. Respektīvi- ja tiek nolasīti visi dati par veikalu X, tad citi lietotāji ne tikai nevarēs mainīt informāciju par veikalu X transakcijas laikā, bet arī nevarēs pievienot jaunus datus.

SNAPSHOT. Vislabāk to var aprakstīt kā apvienojumu- ietver sevī REPEATABLE READ izolācijas līmeni, kas neļauj mainīt nolasītās rindas un vienmēr vaicājums atgriež tādu pašu rindu, kā iepriekšējā reizē transakcijas ietvaros, un READ UNCOMMITTED izolācijas līmeni, kas ļauj modificēt datus transakcijas izpildes laikā. Transakcija, kura izmanto SNAPSHOT izolācijas līmeni, neuzliks ierobežojumu mainīt rindas, kuras tas nolasa, savukārt garantē to, ka nākamajā reizē nolasot rindu, tā tiks nolasīta tieši tāda pati, kā iepriekšējā reizē. Veidojot lietojumprogrammas tas ir neatsverams pluss, jo tiek mazināta konkurence uz datiem un retāk rodas problēmas glabājot datus (noslogotās sistēmās). Šī nebloķējošā uzvedība tiek panākta, saglabājot iepriekš apstiprinātās rindas izmaiņas tempdb datu bāzē. Kad notiek rindas mainīšana vai dzēšana, iepriekšējā rindas versija tiek nokopēta uz tempdb un rādītājs uz iepriekšējo versiju tiek saglabāts pie tekošās rindas versijas. Datu lasītāji, kas sāka transakciju pirms rakstīšanas, un nolasījuši iepriekšējo versiju, turpinās nolasīt iepriekšējo rindas versiju. Tajā pašā laikā rakstīšanas operācijas var notikt, un citās transakcijās varēs redzēt jauno rindas versiju.

READ COMMITTED SNAPSHOT
. ir uzlabots READ COMMITED variants, kurš uzvedas līdzīgi kā SNAPSHOT izolācijas līmenis viena vaicājuma izpildes (nevis transakcijas) laikā. Dēļ tā, ka šis izolācijas līmenis stipri palielina aktivitāti temdb datu bāzē, šis izolācijas līmenis nav atļauts pēc noklusēšanas un, lai to varētu izmantot, tas ir speciāli jāatļauj. Pirms šī izolācijas līmeņa atļaušanas produkcijas datu bāzēs, ir rūpīgi jānotestē, vai temdb var tikt galā ar šo papildus noslodzi.

Nav komentāru:

Komentāra publicēšana