See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 13898|Vastuse: 0

[Allikas] Lukud, räpased lugemised, kordumatud lugemised ja valed lugemised SQL-is

[Kopeeri link]
Postitatud 20.07.2016 12:37:53 | | |
Lüüside ülevaade
1. Miks lisada lukud
Kui mitu kasutajat teevad andmebaasis samaaegselt operatsioone, tekivad järgmised andmeebakõlad:
Puuduvad uuendused
Kaks kasutajat, A ja B, loevad samu andmeid ja muudavad neid ning ühe kasutaja muudatuse tulemus hävitab teise muudatuse tulemuse, näiteks piletibroneerimise süsteemi
Räpane lugemine
Kasutaja A muudab andmeid, seejärel loeb kasutaja B andmed ette, kuid kasutaja A tühistab muutmise mingil põhjusel ning andmed naasevad algsele väärtusele
Ära loe korduvalt
Kasutaja A loeb andmeid, seejärel kasutaja B loeb andmeid ja muudab neid
Peamine paralleelsuse kontrolli meetod on blokeerimine, mis on keelata kasutajatel teatud toimingute tegemine teatud ajaks, et vältida andmete ebajärjekindlust

2. Lukkude klassifikatsioon
Lukke jagunevad kaks kategooriasse:
1 . Andmebaasisüsteemi vaatenurgast: see jaguneb eksklusiivseteks lukkudeks (st eksklusiivsed lukud), jagatud lukkudeks ja uuenduslukkudeks
MS - SQL Server kasutab järgmisi ressursiluku mustreid.
Lukustusrežiimi kirjeldus
Share(id) kasutatakse operatsioonide jaoks, mis ei muuda ega uuenda andmeid (ainult lugemispõhised operatsioonid), näiteks SELECT laused.
Update (U) kasutatakse uuendatavates ressurssides. Takistab tavalisi ummikseisusid, kui loetakse mitut sessiooni, lukustatakse ja võimalik, et ressursiuuendus võib toimuda.
Eksklusiivset (X) kasutatakse andmete muutmise operatsioonideks, nagu INSERT, UPDATE või DELETE. Veendu, et mitu uuendust ei tehtaks samal ressursil samaaegselt.
Intent Lock'e kasutatakse lukkude hierarhia loomiseks. Intent-lukustuste tüübid on: Intent Shared (IS), Intent Exclusive (IX) ja Intent Exclusive (SIX).
Skeemilukke kasutatakse operatsioonide puhul, mis sõltuvad tabeli skeemist. Skeemilukkude tüübid on: skeemi modifikatsioon (Sch -M) ja skeemi stabiilsus (Sch -S).
Massiuuendusi (BU-sid) kasutatakse siis, kui suured andmemahud kopeeritakse tabelisse ja määratakse TABLOCK-vihje.
Ühised lukud
Jagatud lukustus võimaldab samaaegsetel tehingutel ressurssi lugeda (SELECT). Kui ressursil eksisteerib jagatud (S) lukk, ei saa ükski teine tehing andmeid muuta. Vabastage jagatud (S) lukk ressursil kohe, kui andmed on loetud, välja arvatud juhul, kui tehingu isoleerimise tase on seatud korduvaks või kõrgemaks, või kui jagatud (S) lukk on säilitatud lukuvihjega kogu tehingu eluea vältel.
Uuenda lukk
Uuendus (U) lukud takistavad ummikseisu nende tavapärasel kujul. Tüüpiline uuendusmuster koosneb tehingust, mis loeb kirjet, saab jagatud (S) luku ressursile (lehekülg või rida) ja seejärel muudab rida, mis nõuab luku teisendamist eksklusiivseks (X) lukuks. Kui kaks tehingut saavad ressursile jagatud režiimiluku ja püüavad andmeid samal ajal uuendada, püüab üks tehing muuta luku eksklusiivseks (X) lukuks. Üleminek jagatud režiimist eksklusiivsele lukule peab ootama mõnda aega, sest ühe tehingu eksklusiivne lukustus ei ole ühilduv teise tehingu jagatud režiimi lukustusega; Tekib luku ootamine. Teine tehing püüab saada eksklusiivset (X) lukku uuenduseks. Ummik tekib, kuna mõlemad tehingud teisendatakse eksklusiivseteks (X) lukustusteks ning iga tehing ootab, kuni teine tehing vabastab jagatud režiimi lukustuse.
Selle võimaliku ummikuprobleemi vältimiseks kasuta uuendatud (U) lukku. Ainult üks tehing korraga saab uuendatud (U) lukku ressursile. Kui tehing muudab ressurssi, muudetakse uuenduslukk (U) eksklusiivseks (X) lukuks. Vastasel juhul muudetakse lukk jagatud lukuks.
Eksklusiivsed lukud
Eksklusiivsed (X) lukud takistavad samaaegsetel tehingutel ressurssidele ligipääsu. Teised tehingud ei saa lugeda ega muuta andmeid, mis on lukustatud eksklusiivse (X) lukuga.
Kavatsuslukk
Intent lock tähendab, et SQL Server peab omandama jagatud (S) luku või eksklusiivse (X) luku mõnele hierarhia aluseks olevale ressursile. Näiteks tabeli tasemel paigutatud jagamiskavatsuse lukk näitab, et tehing kavatseb paigutada jagamis(te) luku tabeli lehele või reale. Tahetuse lukustuse seadistamine tabelitasemel takistab teisel tehingul hiljem omandamast eksklusiivset (X) lukku tabelis, mis seda lehte sisaldab. Intent-lukud võivad parandada jõudlust, sest SQL Server kontrollib intent-luku ainult tabeli tasemel, et otsustada, kas tehing saab ohutult sellel tabelil lukustuse. Selle asemel, et kontrollida lukustusi igal real või lehel tabelis, et selgitada, kas tehing suudab lukustada kogu tabeli.
Intent-lukud hõlmavad Intent Sharing (IS), Intent Exclusive (IX) ja Intent Exclusive Sharing (SIX).
Lukustusrežiimi kirjeldus
Intent Sharing (IS) näitab, et tehingu kavatsus hõlmab mõningaid, mitte kõiki lugemishierarhia aluseks olevaid ressursse, paigutades igale ressursile S-lukud.
Intent Exclusive (IX) näitab, et tehingu eesmärk on muuta mõningaid, kuid mitte kõiki, hierarhia aluseks olevaid ressursse, asetades igale ressursile X-luku. IX on IS-i ülemhulk.
Eksklusiivne jagamine kavatsusega (SIX) näitab, et tehingu eesmärk on lugeda kõiki hierarhias olevaid aluseks olevaid ressursse ja muuta, kuid mitte kõiki, aluseks olevaid ressursse, paigutades igale ressursile IX-lukud. Luba samaaegseid IS-lukustusi tipptasemel ressurssidele. Näiteks tabeli KUUS lukustus asetab lauale KUUE luku (võimaldades samaaegseid IS-lukke) ja IX luku hetkel muudetud lehele (muudetud reale X-lukk). Kuigi igal ressursil võib olla ainult üks SIX lukk teatud aja jooksul, et takistada teistel tehingutel ressursi uuendamist, saavad teised tehingud lugeda hierarhias aluseks olevaid ressursse, hankides tabelitasemel IS-lukke.
Eksklusiivne lukustus: Ainult lukustustoimingu teostav programm võib seda kasutada ning muid selle operatsioone ei aktsepteerita. Kui käivitad andmete uuendamise käsu, kasutab SQL Server automaatselt eksklusiivset lukku. Kui objektil on teised lukud, ei saa sa sellele lisada eksklusiivset lukku.
Jagatud lukk: Jagatud lukuga lukustatud ressurssi saavad lugeda teised kasutajad, kuid teised kasutajad ei saa seda muuta.
Uuenduslukk: Kui SQL Server on valmis andmeid uuendama, lukustab ta esmalt andmeobjekti, nii et andmeid ei saa muuta, kuid neid saab lugeda. Kui SQL Server otsustab, et soovib andmeid uuendada, asendab ta automaatselt uuendusluku eksklusiivse lukuga ega saa sellele uuenduslukku lisada, kui objektil on teisi lukustusi.

2 . Programmeerija vaatenurgast: see jaguneb optimistlikuks ja pessimistlikuks lukuks.
Optimism Lock: Sõltub täielikult andmebaasist, et hallata luku tööd.
Pessimistlikud lukud: Programmeerijad haldavad lukude käsitlemist andmete või objektide peal ise.
MS - SQLSERVER kasutab lukke, et rakendada pessimistlikku paralleelsuse kontrolli mitme kasutaja vahel, kes teevad andmebaasis samaaegselt muudatusi

3. Luku osakeste suurus
Luku granulaarsus on blokeeritud sihtmärgi suurus, väike blokeerimisgranulaarsus on kõrge samaaegsus, kuid üldkulu on suur ja suur blokeerimisgranulaarsus on madal samaaegsus, kuid üldkulu on väike
SQL Server toetab luku granulaarsust ridade, lehtede, võtmete, võtmevahemike, indeksite, tabelite või andmebaaside jaoks
Ressursi kirjeldus
RID-rea identifikaator. Kasutati laua rea lukustamiseks.
Võtmerea lukustus indeksis. Kasutatakse seriaalsete tehingute võtmete vahemiku kaitsmiseks.
8 kilobaiti (KB) andmelehti või indeksilehti.
Laiendatud ketas Kaheksa kõrvuti asetseva andmelehe või indeksilehekülje kogum.
Tabel Kogu tabel, mis sisaldab kõiki andmeid ja indekseid.
DB andmebaas.
4. Lukustamisaja pikkus
Luku hoidmise aeg on aeg, mis kulub ressursi kaitsmiseks soovitud tasemel.
Jagatud luku hoidmisaeg, mida kasutatakse lugemisoperatsioonide kaitsmiseks, sõltub tehingute isolatsioonitasemest. Vaikimisi tehinguisolatsiooni tasemega READ COMMITTED juhitakse jagatud lukku ainult lugemislehe kestuse jooksul. Skaneerimisel ei vabastata lukku enne, kui lukk on tuvastatud järgmisel lehel. Kui määrad HOLDLOCK prompti või seadistad tehingu isolatsioonitaseme REPEATABLE READ või SERIALISABLE, ei vabastata lukku enne, kui tehing on lõppenud.
Sõltuvalt kursori paralleelsuse valikust saab kursor jagatud režiimis saada kerimisluku, et kaitsta ekstrakti. Kui on vaja kerimislukku, ei vabastata kerimislukku enne, kui kursor eemaldatakse või suletakse, olenevalt sellest, kumb juhtub varem. Kui aga määrad HOLDLOCKi, siis kerimislukk ei vabastata enne tehingu lõppu.
Eksklusiivne lukk, mida kasutatakse uuenduse kaitsmiseks, ei vabastata enne tehingu lõppu.
Kui ühendus üritab saada lukku, mis on vastuolus teise ühenduse kontrollitava lukuga, blokeeritakse ühendus, mis püüab lukku saada, kuni:
Konfliktne lukk vabastatakse ja ühendus saab soovitud luku.
Ühenduse aegumine on läbi. Vaikimisi pole ajapiirangu intervalli, kuid mõned rakendused seavad ajapiirangu intervallid, et vältida määramatut ootamist

Viis luku kohandamist SQL Serveris
1 Lahenda ummikseisud ja sea prioriteedid
Ummik on lõputu ootamine, mis tekib mitme kasutaja taotlemisel erinevatele plokkidele, sest taotlejal on osa blokeerimisõigusest ja ootab osalist blokeerimist teistele kasutajatele
SET DEADLOCK_PRIORITY abil saab kontrollida, kuidas sessioon reageerib ummikseisu korral. Kui mõlemad protsessid lukustavad andmed ja kumbki protsess ei saa oma lukku vabastada enne, kui teine protsess oma luku vabastab, tekib ummikseisu.

2 Käsitle timeout'e ja sea lukustuse ajapiirangud.
@@LOCK_TIMEOUT Tagastab praeguse lukustuse ajapiirangu seadistuse millisekundites
SET LOCK_TIMEOUT seade võimaldab rakendusel määrata maksimaalse aja, mille lause ootab ressursi blokeerimiseks. Kui avalduse ooteaeg ületab LOCK_TIMEOUT seadistuse, tühistab süsteem automaatselt blokeerimislause ja tagastab rakendusele veateate 1222, et lukustustaotluse ajapiirangu periood on ületatud

näide
Järgmises näites on lukustuse ajapiirangu periood seatud 1 800 millisekundile.
SET LOCK_TIMEOUT1800

3) Sea tehingute isolatsioonitase.

4) Kasuta tabelitasandi lukuvihjeid SELECT, INSERT, UPDATE ja DELETE lausete jaoks.

5) Seadista indeksi lukustatav granulaarsus
Saad kasutada sp_indexoption süsteemi salvestatud protseduure, et määrata luku detailsus indekseerimiseks

6. Vaata luku infot

1 Teosta EXEC SP_LOCK edasta info luku kohta
2 Vajutage päringuanalüsaatoris Ctrl + 2, et näha luku infot

7. Ettevaatusabinõud kasutusel

Kuidas vältida ummikseisu
1. Tehingute kasutamisel püüa lühendada tehingute loogilist töötlemisprotsessi ning esitada või tagasi võtta tehingud varakult.
2 Seadke lukustuse ajapiirangu parameeter mõistlikule vahemikule, näiteks: 3 minutit - 10 minutit; Pärast seda aega katkestatakse operatsioon automaatselt, et vältida protsessi seiskumist;
3. Optimeerida programmi, kontrollida ja vältida ummikseisu nähtust;
4. Testi kõiki skripte ja sp-sid hoolikalt enne täpset versiooni.
5 Kõigil SP-del peab olema veahaldus (@error kaudu)
6 Ära muuda SQL SERVER tehingute vaikimisi taset. Sundlukustust ei soovitata

Lahenda probleem Kuidas lukustada ridatabeli andmebaas

8. Mitmed küsimused lukkude kohta

1 Kuidas lukustada laua rida
SEA TEHINGUISOLATSIOONI TASE READUNCOMMITTED
VALI *tabelist ROWLOCK, kus id = 1

2 Lukusta tabel andmebaasis
VALI *TABELIST WITH( HOLDLOCK )

Lukustus:
sybase:
uuenda tabeli komplekt col1 = col1, kus1= 0 ;
MSSQL:
vali col1 tabelist (tablockx), kus 1= 0 ;
oracle:
LUKUSTUSTABELI EKSKLUSIIVSES REŽIIMIS ;
Pärast lukustust ei saa keegi teine seda kasutada enne, kui lukustatud kasutaja selle avab ja see avatakse commit'i või rollback'iga

Mõned näited aitavad sul oma muljet süvendada
Seadista tabel1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3

1) Eksklusiivne lukk
Loo kaks uut ühendust
Täida järgmine lause esimeses ühenduses
alusta tranni
Uuendustabel 1
komplekt A= ' aa '
kus B= ' b2 '
oota viivitust' 00:00:30' --oota 30 sekundit
commit tran
Täida järgmine lause teises ühenduses
alusta tranni
Vali *tabelist 1
kus B= ' b2 '
commit tran

Kui ülaltoodud kaks lauset täidetakse samaaegselt, peab valikupäring ootama uuenduse käivitamist, st ootama 30 sekundit

2) Jagatud lukk
Täida järgmine lause esimeses ühenduses
alusta tranni
vali *tabelist 1 hoidmislukk – hoidmislukk lisatakse kunstlikult lukku
kus B= ' b2 '
oota viivitust' 00:00:30' --oota 30 sekundit
commit tran

Täida järgmine lause teises ühenduses
alusta tranni
vali A,C tabelist 1
kus B= ' b2 '
Uuendustabel 1
komplekt A= ' aa '
kus B= ' b2 '
commit tran

Kui ülaltoodud kaks lauset täidetakse samaaegselt, saab teise ühenduse valikupäringu täita
Uuendus peab ootama, kuni esimene tehing vabastab jagatud luku ja muudab selle eksklusiivseks lukuks, enne kui seda saab täita, st ootama 30 sekundit

3) Ummikseis
Lisatud tabel2(D,E)
D E
d1 e1
d2 e2
Täida järgmine lause esimeses ühenduses
alusta tranni
Uuendustabel 1
komplekt A= ' aa '
kus B= ' b2 '
oota viivitust' 00:00:30'
Uuenda tabel 2
komplekt D= ' d5 '
kus E= ' e1 '
commit tran

Täida järgmine lause teises ühenduses
alusta tranni
Uuenda tabel 2
komplekt D= ' d5 '
kus E= ' e1 '
oota viivitust' 00:00:10'
Uuendustabel 1
komplekt A= ' aa '
kus B= ' b2 '
commit tran

Samal ajal tuvastab süsteem ummikseisu ja katkestab protsessi

Lisaks:
SQL Server 2000 poolt toetatud tabelitasandi lukustusvihjed

HOLDLOCK hoiab jagatud lukku kuni kogu tehingu lõpetamiseni ning peaks vabastama kohe, kui lukustatud objekti enam vaja ei ole, mis võrdub SERIALISEERITAVA tehinguisolatsiooni tasemega
NOLOCK-lause täidetakse ilma jagatud lukustuseta, võimaldades räpaseid lugemisi, mis on võrdne READ UNCOMMITTED tehingu isoleerimise tasemega
PAGLOCK kasutab mitut leheküljelukku, kus kasutatakse ühte tabelilukku
READPAST võimaldab SQL serveril vahele jätta kõik lukustatud read ja täita tehinguid ning READ UNCOMCOMITY-tehingu isolatsioonitasemete puhul vahele jätta ainult RID-lukud, mitte lehe-, tsooni- ja tabelilukud
ROWLOCK nõuab ridalukkude kasutamist
TABLOCKX rakendab eksklusiivset tabelitasandi lukustust, mis takistab teistel tehingutel tabelit tehingu ajal kasutada
UPLOCK sunnib uuendusi kasutama, kui loetakse tabelit ilma jagatud lukustuseta

Rakenduse lukk:
Rakenduslukk on lukk, mille genereerib kliendikood, mitte SQL Serveri enda loodud lukk

Kaks protsessi rakenduslukkude käsitlemiseks
sp_getapplock Lukustada rakenduse ressursid
sp_releaseapplock Avage rakenduse ressursid

Märkus: Erinevus tabeli lukustamise vahel andmebaasis

SELECT *FROM table WITH( HOLD LOCK ) Teised tehingud võivad tabelit lugeda, kuid ei saa uuendada ega kustutada
SELECT *FROM table WITH(TABLOCKX) Teised tehingud ei saa tabelit lugeda, uuendada ega kustutada





Eelmine:Lõpp-punkti kuulamist polnud http://localhost:111/xxx.svc et see c...
Järgmine:SQL lukustab NOLOCK, HOLDLOCK, UPDLOCK, TABLOCK, TABLOCKX
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com