Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 13898|Atsakyti: 0

[Šaltinis] Spynos, nešvarūs skaitymai, nepakartojami skaitymai ir klaidingi skaitymai SQL

[Kopijuoti nuorodą]
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
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com