|
|
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
|