|
|
Paskelbta 2016-07-20 12:37:53
|
|
|

Spynų apžvalga 1. Kodėl reikia įvesti spynas Kai keli vartotojai vienu metu atlieka operacijas duomenų bazėje, atsiranda šie duomenų neatitikimai: Trūksta naujinimų Du naudotojai, A ir B, nuskaito tuos pačius duomenis ir juos keičia, o vieno vartotojo pakeitimo rezultatas sunaikina kito pakeitimo, pvz., bilietų rezervavimo sistemos, rezultatą Nešvarus skaitymas Vartotojas A modifikuoja duomenis, o tada vartotojas B nuskaito duomenis, bet vartotojas A dėl kokių nors priežasčių atšaukia duomenų modifikavimą ir duomenys grįžta į pradinę reikšmę Neskaitykite pakartotinai Vartotojas A nuskaito duomenis, o tada vartotojas B nuskaito duomenis ir juos modifikuoja Pagrindinis lygiagrečios kontrolės būdas yra blokavimas, t. y. uždrausti vartotojams tam tikrą laiką atlikti tam tikras operacijas, kad būtų išvengta duomenų neatitikimų
2. Spynų klasifikacija Yra du suskirstymai į spynų kategorijas: 1 . Duomenų bazės sistemos požiūriu: ji skirstoma į išskirtines spynas (t. y. išskirtines spynas), bendras spynas ir atnaujinimo spynas MS - SQL serveris naudoja šiuos išteklių užrakto modelius. Užrakto režimo aprašymas Bendrinimas (-ai) naudojamas operacijoms, kurios nekeičia ir neatnaujina duomenų (tik skaitymo operacijos), pvz., SELECT sakiniams. Naujinimas (U) naudojamas atnaujinamuose ištekliuose. Apsaugo nuo įprastų aklavietės formų, kai skaitomi, užrakinami keli seansai ir gali įvykti išteklių atnaujinimas. Išskirtinis (X) naudojamas duomenų modifikavimo operacijoms, pvz., INSERT, UPDATE arba DELETE. Įsitikinkite, kad tuo pačiu metu neatliekami keli to paties ištekliaus naujinimai. Ketinimų užraktai naudojami spynų hierarchijai nustatyti. Ketinimų užraktų tipai yra šie: bendras ketinimas (IS), išskirtinis ketinimas (IX) ir išskirtinis ketinimas (SIX). Schemos užraktai naudojami atliekant operacijas, kurios priklauso nuo lentelės schemos. Schemos spynų tipai yra šie: schemos modifikavimas (Sch -M) ir schemos stabilumas (Sch -S). Masiniai naujinimai (BU) naudojami, kai į lentelę nukopijuojami dideli duomenų kiekiai ir nurodoma TABLOCK užuomina. Bendrai naudojami užraktai Bendrai naudojamas (-i) užraktas leidžia vienu metu atliekamoms operacijoms nuskaityti (SELECT) išteklius. Kai ištekliuose yra bendrai naudojamas (S) užraktas, jokia kita operacija negali pakeisti duomenų. Atleiskite bendrai naudojamą (S) išteklių užraktą, kai tik duomenys bus perskaityti, nebent operacijos izoliavimo lygis nustatytas kaip pakartojamas arba aukštesnis, arba bendrinamas (S) užraktas išlaikomas su užrakto užuomina visą operacijos gyvavimo laiką. Atnaujinti užraktą Atnaujinimo (U) užraktai apsaugo nuo aklavietės įprasta forma. Įprastą naujinimo šabloną sudaro operacija, kuri nuskaito įrašą, gauna bendrai naudojamą (S) išteklių (puslapio arba eilutės) užraktą ir modifikuoja eilutę, todėl užraktą reikia konvertuoti į išskirtinį (X) užraktą. Jei dvi operacijos įgyja ištekliaus bendro režimo užraktą ir bando atnaujinti duomenis tuo pačiu metu, viena operacija bando konvertuoti užraktą į išskirtinį (X) užraktą. Perėjimas iš bendro režimo į išskirtinį užraktą turi šiek tiek palaukti, nes išskirtinis vienos operacijos užraktas nesuderinamas su kitos operacijos bendro režimo užraktu; Įvyksta užrakto laukimas. Antroji operacija bando gauti išskirtinį (X) užraktą atnaujinimui. Aklavietė įvyksta, nes abi operacijos konvertuojamos į išskirtinius (X) užraktus, o kiekviena operacija laukia, kol kita operacija atlaisvins bendro režimo užraktą. Norėdami išvengti šios galimos aklavietės problemos, naudokite atnaujintą (U) užraktą. Tik viena operacija vienu metu gali gauti atnaujintą (U) išteklių užraktą. Jei operacija pakeičia išteklius, atnaujinimo (U) užraktas konvertuojamas į išskirtinį (X) užraktą. Priešingu atveju užraktas konvertuojamas į bendrai naudojamą užraktą. Išskirtinės spynos Išskirtiniai (X) užraktai neleidžia vienalaikėms operacijoms pasiekti išteklių. Kitos operacijos negali nuskaityti ar modifikuoti duomenų, užrakintų išskirtiniu (X) užraktu. Ketinimo užraktas Tikslo užraktas nurodo, kad SQL serveris turi įsigyti bendrai naudojamą (S) arba išskirtinį (X) užraktą kai kuriems pagrindiniams hierarchijos ištekliams. Pavyzdžiui, lentelės lygiu esantis bendrinimo tikslo užraktas rodo, kad operacija ketina užrakinti bendrinimą lentelės puslapyje arba eilutėje. Nustačius ketinimų užraktą lentelės lygiu, kita operacija vėliau neįgyja išskirtinio (X) užrakto lentelėje, kurioje yra tas puslapis. Ketinimų užraktai gali pagerinti našumą, nes SQL serveris tikrina ketinimų užraktą tik lentelės lygiu, kad nustatytų, ar operacija gali saugiai užrakinti tą lentelę. Užuot tikrinę kiekvienos lentelės eilutės ar puslapio užraktus, kad nustatytumėte, ar operacija gali užrakinti visą lentelę. Ketinimų užraktai apima ketinimų bendrinimą (IS), išskirtinį ketinimą (IX) ir išskirtinį ketinimų bendrinimą (SIX). Užrakto režimo aprašymas Ketinimų bendrinimas (IS) rodo, kad operacijos tikslas yra kai kurie, o ne visi pagrindiniai skaitymo hierarchijos ištekliai, kiekvienam ištekliui uždedant S užraktus. Išskirtinis ketinimas (IX) nurodo, kad operacijos tikslas yra modifikuoti kai kuriuos, bet ne visus pagrindinius hierarchijos išteklius, kiekvienam ištekliui uždedant X užraktą. IX yra IS superaibė. Išskirtinis bendrinimas su ketinimu (SIX) rodo, kad operacijos tikslas yra perskaityti visus pagrindinius hierarchijos išteklius ir modifikuoti kai kuriuos, bet ne visus pagrindinius išteklius, kiekvienam ištekliui uždedant IX užraktus. Leisti vienu metu užrakinti IS aukščiausio lygio ištekliuose. Pavyzdžiui, lentelės SIX užraktas uždeda SIX užraktą ant stalo (leidžiant vienu metu IS užraktus) ir IX užraktą šiuo metu modifikuotame puslapyje (X užraktas modifikuotoje eilutėje). Nors kiekvienas išteklius tam tikrą laiką gali turėti tik vieną SIX užraktą, kad kitos operacijos negalėtų atnaujinti ištekliaus, kitos operacijos gali nuskaityti pagrindinius išteklius hierarchijoje įsigydamos lentelės lygio IS užraktus. Išskirtinis užraktas: juo gali naudotis tik užrakinimo operaciją atliekanti programa, o kitos su ja susijusios operacijos nebus priimamos. Kai vykdote duomenų naujinimo komandą, SQL serveris automatiškai naudoja išskirtinį užraktą. Kai objekte yra kitų užraktų, negalite prie jo pridėti išskirtinio užrakto. Bendrinamas užraktas: bendrai naudojamo užrakto užrakintą išteklių gali perskaityti kiti vartotojai, tačiau kiti vartotojai negali jo modifikuoti. Atnaujinimo užraktas: kai SQL serveris yra pasirengęs atnaujinti duomenis, jis pirmiausia užrakina duomenų objektą, kad duomenų nebūtų galima modifikuoti, bet juos būtų galima perskaityti. Kai SQL serveris nustato, kad nori atnaujinti duomenis, jis automatiškai pakeis naujinimo užraktą išskirtiniu užraktu ir negalės pridėti naujinimo užrakto, kai objekte yra kitų užraktų.
2 . Programuotojo požiūriu: jis skirstomas į optimistinį ir pesimistinį užraktą. Optimizmo užraktas: visiškai priklauso nuo duomenų bazės, kad valdytų spynos darbą. Pesimistiniai užraktai: programuotojai patys valdo duomenų ar objektų užrakto tvarkymą. MS - SQLSERVER naudoja spynas, kad įgyvendintų pesimistinę sutapimo kontrolę tarp kelių vartotojų, kurie vienu metu atlieka duomenų bazės pakeitimus
3. Spynos dalelių dydis Užrakto detalumas yra užblokuoto tikslo dydis, mažas blokavimo detalumas yra didelis sutapimas, tačiau pridėtinės išlaidos yra didelės, o didelis blokavimo detalumas yra mažas sutapimas, bet pridėtinės išlaidos yra mažos SQL serveris palaiko eilučių, puslapių, raktų, raktų diapazonų, indeksų, lentelių ar duomenų bazių užrakto detalumą Išteklių aprašymas RID eilutės identifikatorius. Naudojamas atskirai užrakinti lentelės eilutę. Raktų eilutės užraktas rodyklėje. Naudojamas apsaugoti raktų diapazoną nuosekliose operacijose. 8 kilobaitai (KB) duomenų puslapių arba rodyklės puslapių. Išplėstinis diskas Aštuonių gretimų duomenų puslapių arba rodyklės puslapių rinkinys. Lentelė Visa lentelė su visais duomenimis ir rodyklėmis. DB duomenų bazė. 4. Užrakinimo trukmė Užrakto laikymo trukmė yra laikas, reikalingas apsaugoti išteklius reikiamu lygiu. Bendrai naudojamo užrakto sulaikymo laikas, naudojamas skaitymo operacijoms apsaugoti, priklauso nuo operacijos izoliavimo lygio. Naudojant numatytąjį operacijos izoliavimo lygį READ COMMITTED, bendrai naudojamas užraktas valdomas tik skaitymo puslapio metu. Nuskaitymo metu užraktas neatleidžiamas, kol užraktas neįgyjamas kitame nuskaitymo puslapyje. Jei nurodysite HOLDLOCK raginimą arba nustatysite operacijos izoliavimo lygį į REPEATABLE READ arba SERIALIZABLE, užraktas nebus atleistas, kol operacija nebus baigta. Priklausomai nuo žymekliui nustatytos lygiagrečios parinkties, žymeklis gali įgyti slinkties užraktą bendruoju režimu, kad apsaugotų ištrauką. Kai reikalingas slinkties užraktas, slinkties užraktas neatleidžiamas iki kito žymeklio ištraukimo arba uždarymo, atsižvelgiant į tai, kas įvyksta anksčiau. Tačiau jei nurodysite HOLDLOCK, slinkties užraktas nebus atleistas iki operacijos pabaigos. Išskirtinis užraktas, naudojamas naujinimui apsaugoti, nebus atleistas iki operacijos pabaigos. Jei ryšys bando gauti užraktą, kuris prieštarauja kito ryšio valdomam užraktui, ryšys, bandantis gauti užraktą, bus užblokuotas, kol: Nesuderinamas užraktas atleidžiamas ir ryšys įgyja pageidaujamą užraktą. Baigėsi ryšio skirtasis laikas. Pagal numatytuosius nustatymus skirtojo laiko intervalo nėra, tačiau kai kurios programos nustato skirtojo laiko intervalus, kad būtų išvengta neapibrėžto laukimo
Penki SQL serverio spynų pritaikymas 1 Tvarkykite aklavietes ir nustatykite aklavietės prioritetus Aklavietė yra nesibaigiantis laukimas, kurį sukelia keli vartotojai, kurie kreipiasi dėl skirtingų blokų, nes pareiškėjas turi dalį blokavimo teisės ir laukia dalinio blokavimo, priklausančio kitiems vartotojams Galite naudoti DEADLOCK_PRIORITY SET, kad valdytumėte, kaip seansas reaguoja aklavietės atveju. Jei abu procesai užrakina duomenis ir kiekvienas procesas negali atleisti savo užrakto, kol kitas procesas neatleidžia savo užrakto, įvyksta aklavietė.
2 Tvarkykite skirtąjį laiką ir nustatykite užrakto skirtojo laiko trukmę. @@LOCK_TIMEOUT Pateikia dabartinio seanso užrakto skirtojo laiko nustatymą milisekundėmis Parametras SET LOCK_TIMEOUT leidžia programai nustatyti maksimalų laiką, per kurį išrašas laukia, kol užblokuos išteklius. Kai išrašo laukimo laikas yra ilgesnis nei LOCK_TIMEOUT nustatymas, sistema automatiškai atšaukia blokavimo sakinį ir grąžina programai klaidos pranešimą 1222, kad viršytas užrakto užklausos skirtasis laikas
pavyzdys Toliau pateiktame pavyzdyje užrakto skirtasis laikas nustatytas į 1 800 milisekundžių. NUSTATYTI LOCK_TIMEOUT1800
3) Nustatykite operacijos izoliacijos lygį.
4) Naudokite lentelės lygio užrakto užuominas SELECT, INSERT, UPDATE ir DELETE sakiniams.
5) Sukonfigūruokite indekso fiksavimo detalumą Galite naudoti sp_indexoption sistemos saugomas procedūras, kad nustatytumėte indeksavimo užrakto detalumą
6. Peržiūrėkite užrakto informaciją
1 Atlikite EXEC SP_LOCK praneškite informaciją apie užraktą 2 Paspauskite Ctrl + 2 užklausų analizatoriuje, kad pamatytumėte užrakto informaciją
7. Atsargumo priemonės
Kaip išvengti aklavietės 1. Naudodamiesi operacijomis, pabandykite sutrumpinti loginį operacijų apdorojimo procesą ir anksčiau pateikti arba atšaukti operacijas. 2 Nustatykite aklavietės skirtojo laiko parametrą į pagrįstą diapazoną, pvz.: 3 minutės - 10 minučių; Pasibaigus laikui, operacija bus automatiškai nutraukta, kad procesas neužstrigtų; 3. Optimizuokite programą, patikrinkite ir venkite aklavietės reiškinio; 4. Atidžiai išbandykite visus scenarijus ir SP prieš tikslią versiją. 5 Visi SP turi turėti klaidų tvarkymo (per @error) 6 Nekeiskite numatytojo SQL SERVER operacijų lygio. Priverstinis užrakinimas nerekomenduojamas
Išspręskite problemą Kaip užrakinti eilučių lentelės duomenų bazę
8. Keli klausimai apie spynas
1 Kaip užrakinti stalo eilutę NUSTATYTI OPERACIJOS IZOLIACIJOS LYGĮ READUNCOMMITTED SELECT *FROM table ROWLOCKWHERE id = 1
2 Užrakinkite lentelę duomenų bazėje SELECT *FROM table WITH( HOLDLOCK )
Užrakto pareiškimas:
sybase: atnaujinti lentelės rinkinį col1 = col1 kur1 = 0 ;
MSSQL: pasirinkite col1iš lentelės (tablockx)kur 1= 0 ;
oracle: UŽRAKINTI STALO STALĄ IŠSKIRTINIU REŽIMU ; Užrakinus užraktą, niekas kitas negali jo valdyti, kol užrakintas vartotojas jo neatrakina, ir jis atrakinamas įsipareigojimu arba atšaukimu
Keli pavyzdžiai padeda pagilinti įspūdį Nustatyti stalą1 (A, B, C) A B C A1 B1 C1 A2 B2 C2 A3 B3 C3
1) Išskirtinis užraktas Sukurkite du naujus ryšius Pirmajame ryšyje vykdykite šį sakinį pradėti tran Atnaujinti lentelę1 set A = ' aa ' kur B = ' b2 ' waitfor delay' 00:00:30' --wait 30 sekundžių atlikti tran Antrame ryšyje vykdykite šį teiginį pradėti tran Pasirinkite *iš lentelės1 kur B = ' b2 ' atlikti tran
Jei pirmiau minėti du teiginiai vykdomi tuo pačiu metu, pasirinkimo užklausa turi palaukti, kol bus įvykdytas atnaujinimas, tai yra, palaukti 30 sekundžių
2) Bendras užraktas Pirmajame ryšyje vykdykite šį sakinį pradėti tran select *from table1 holdlock - Laikiklis dirbtinai pridedamas prie užrakto kur B = ' b2 ' waitfor delay' 00:00:30' --wait 30 sekundžių atlikti tran
Antrame ryšyje vykdykite šį teiginį pradėti tran pasirinkite A, C iš 1 lentelės kur B = ' b2 ' Atnaujinti lentelę1 set A = ' aa ' kur B = ' b2 ' atlikti tran
Jei pirmiau minėti du teiginiai vykdomi vienu metu, galima vykdyti antrojo ryšio pasirinkimo užklausą Atnaujinimas turi palaukti, kol pirmoji operacija atlaisvins bendrinamą užraktą ir konvertuos jį į išskirtinį užraktą, kad jį būtų galima vykdyti, tai yra, palaukti 30 sekundžių
3) Aklavietė Pridėta lentelė2 (D, E) D E d1 e1 d2 e2 Pirmajame ryšyje vykdykite šį sakinį pradėti tran Atnaujinti lentelę1 set A = ' aa ' kur B = ' b2 ' Laukti vėlavimo" 00:00:30' Atnaujinti lentelę2 nustatyti D = ' d5 ' kur E = ' e1 ' atlikti tran
Antrame ryšyje vykdykite šį teiginį pradėti tran Atnaujinti lentelę2 nustatyti D = ' d5 ' kur E = ' e1 ' laukti vėlavimo" 00:00:10' Atnaujinti lentelę1 set A = ' aa ' kur B = ' b2 ' atlikti tran
Tuo pačiu metu sistema aptinka aklavietę ir nutraukia procesą
Pridėti: Lentelės lygio užrakinimo užuominos, kurias palaiko SQL Server 2000
HOLDLOCK išlaiko bendrai naudojamą užraktą, kol bus baigta visa operacija, ir turėtų būti atleistas, kai tik užrakintas objektas nebereikalingas, lygus SERIALIZABLE operacijos izoliavimo lygiui NOLOCK pareiškimas vykdomas neišduodant bendro užrakto, leidžiant nešvarius nuskaitymus, kurie yra lygūs READ UNCOMMITTED operacijos izoliacijos lygiui PAGLOCK naudoja kelis puslapių užraktus, kai naudojamas vienas stalo užraktas READPAST leidžia sql serveriui praleisti visas užrakintas eilutes ir vykdyti operacijas, o READ UNCOMMITTED operacijų izoliavimo lygiams praleisti tik RID užraktus, o ne puslapių, zonų ir lentelių užraktus ROWLOCK užtikrina rowlocks naudojimą TABLOCKX priverčia naudoti išskirtinį stalo lygio užraktą, kuris neleidžia jokiai kitai operacijai naudoti lentelę operacijos metu UPLOCK priverčia naudoti naujinimus skaitant lentelę be bendro užrakto
Programos užraktas: Programos užraktas yra kliento kodo sugeneruotas užraktas, o ne paties SQL serverio sugeneruotas užraktas
Du programų užraktų tvarkymo procesai sp_getapplock užrakinti programos išteklius sp_releaseapplock Programos išteklių atrakinimas
Pastaba: Skirtumas tarp lentelės užrakinimo duomenų bazėje
SELECT *FROM lentelė WITH( HOLDLOCK ) Kitos operacijos gali skaityti lentelę, bet negali atnaujinti ir panaikinti SELECT *FROM table WITH(TABLOCKX) Kitos operacijos negali perskaityti, atnaujinti ir ištrinti lentelės
|
Ankstesnis:Nebuvo galutinio taško klausytis http://localhost:111/xxx.svc, kad c ...Kitą:SQL užraktai NOLOCK, HOLDLOCK, UPDLOCK, TABLOCK, TABLOCKX
|