Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 13898|Odgovoriti: 0

[Vir] Zaklepi, umazana branja, neponovljiva branja in lažna branja v SQL

[Kopiraj povezavo]
Objavljeno na 20. 07. 2016 12:37:53 | | |
Pregled zapornic
1. Zakaj uvajati ključavnice
Ko več uporabnikov hkrati izvaja operacije na bazi podatkov, pride do naslednjih podatkovnih neskladij:
Manjkajoče posodobitve
Dva uporabnika, A in B, bereta iste podatke in jih spreminjata, rezultat spremembe enega uporabnika pa uniči rezultat druge spremembe, kot je sistem za rezervacijo vstopnic
Umazano branje
Uporabnik A spremeni podatke, nato uporabnik B prebere podatke, vendar uporabnik A iz nekega razloga prekliče spremembo podatkov in podatki se vrnejo na prvotno vrednost
Ne berite večkrat
Uporabnik A prebere podatke, nato pa uporabnik B prebere podatke in jih spremeni
Glavna metoda nadzora sočasnosti je blokiranje, kar pomeni, da uporabnikom za določen čas preprečijo izvajanje določenih operacij, da se izognejo neskladjem podatkov

2. Klasifikacija zapornic
Obstajata dve razdelitvi na kategorije zapornic:
1 . Z vidika podatkovnega sistema: razdeljen je na ekskluzivne ključavnice (tj. ekskluzivne ključavnice), deljene ključavnice in posodobitve
MS - SQL Server uporablja naslednje vzorce zaklepanja virov.
Opis načina zaklepanja
Share(i) se uporablja za operacije, ki ne spreminjajo ali posodabljajo podatkov (operacije samo za branje), kot so stavki SELECT.
Update (U) se uporablja v gradivih, ki jih je mogoče posodobiti. Preprečuje pogoste oblike zastojev, ko se bere, zaklene več sej, in morda pride do posodobitve virov.
Ekskluzivno (X) se uporablja za operacije spreminjanja podatkov, kot so INSERT, UPDATE ali DELETE. Poskrbite, da se na istem viru ne izvaja več posodobitev hkrati.
Namerne ključavnice se uporabljajo za vzpostavitev hierarhije ključavnic. Vrste zaklepov namena so: Namen deljen (IS), Namen izključen (IX) in Namen izključen (SIX).
Schema locki se uporabljajo pri izvajanju operacij, ki so odvisne od sheme tabele. Vrste shemskih zaklepov so: sprememba sheme (Sch -M) in stabilnost sheme (Sch -S).
Množične posodobitve (BU) se uporabljajo, ko se v tabelo kopirajo velike količine podatkov in je določen namig.
Skupne ključavnice
Skupna ključavnica omogoča, da sočasne transakcije preberejo (SELECT) vir. Ko na viru obstaja deljena (S) ključavnica, nobena druga transakcija ne more spreminjati podatkov. Sprostite deljeno (S) zaklepanje na viru takoj, ko so podatki prebrani, razen če je stopnja izolacije transakcije nastavljena na ponovljivo ali višjo, ali če je deljena (S) ključavnica ohranjena z namigom za zaklepanje skozi celotno življenjsko dobo transakcije.
Posodobi zaklep
Update (U) ključavnice preprečujejo zastoje v svoji običajni obliki. Tipičen vzorec posodobitve obsega transakcijo, ki prebere zapis, dobi skupno (S) zaklepanje za vir (stran ali vrstico) in nato spremeni vrstico, kar zahteva, da se ključavnica pretvori v ekskluzivno (X) ključavnico. Če dve transakciji pridobita zaklep v deljenem načinu na viru in nato hkrati poskušata posodobiti podatke, ena transakcija poskuša zaklep pretvoriti v ekskluzivno (X) zaklepanje. Prehod iz deljenega načina v ekskluzivno zaklepanje mora počakati nekaj časa, ker izključna ključavnica ene transakcije ni združljiva z deljeno načinno zaklepanjo druge transakcije; Pride do čakanja na zaklep. Druga transakcija poskuša pridobiti ekskluzivno (X) zaklepanje za posodobitev. Do zastoja pride, ker sta obe transakciji pretvorjeni v ekskluzivne (X) ključavnice, vsaka transakcija pa čaka, da druga transakcija sprosti zaklep v deljenem načinu.
Da bi se izognili morebitni težavi z zastojem, uporabite posodobljeno (U) ključavnico. Le ena transakcija naenkrat lahko dobi posodobljeno (U) zaklepanje za vir. Če transakcija spremeni vir, se zaklep za posodobitev (U) pretvori v ekskluzivni (X) zaklep. V nasprotnem primeru se ključavnica pretvori v skupno ključavnico.
Ekskluzivne ključavnice
Ekskluzivne (X) ključavnice preprečujejo sočasnim transakcijam dostop do virov. Druge transakcije ne morejo prebrati ali spreminjati podatkov, zaklenjenih z ekskluzivno (X) zaklepavnico.
Zaklep namere
Zaklep z namenom pomeni, da mora SQL Server pridobiti skupno (S) ključavnico ali ekskluzivno (X) ključavnico na nekaterih osnovnih virih v hierarhiji. Na primer, zaklep namena delitve na ravni tabele pomeni, da transakcija namerava postaviti zaklep delnic na stran ali vrstico v tabeli. Nastavitev zaklepa namena na ravni tabele prepreči, da bi druga transakcija kasneje pridobila ekskluzivno (X) zaklepanje na tabeli, ki vsebuje to stran. Zaklepi namena lahko izboljšajo zmogljivost, ker SQL Server preverja zaklepanje namena le na ravni tabele, da ugotovi, ali lahko transakcija varno pridobi zaklep na tej tabeli. Namesto da bi preverjali ključavnice na vsaki vrstici ali strani v tabeli, da bi ugotovili, ali lahko transakcija zaklene celotno tabelo.
Zaklepi namena vključujejo deljenje namena (IS), ekskluzivno namero (IX) in ekskluzivno deljenje namena (SIX).
Opis načina zaklepanja
Deljenje namena (IS) označuje, da je namen transakcije nekaj, ne pa vseh, osnovnih virov v hierarhiji branja, tako da se na vsak vir postavijo S-ključavnice.
Namen Izključno (IX) pomeni, da je namen transakcije spremeniti neke, vendar ne vse, osnovnih virov v hierarhiji z uvedbo X-zaklepa na vsak vir. IX je nadmnožica IS.
Ekskluzivno deljenje z namenom (SIX) pomeni, da je namen transakcije prebrati vse osnovne vire v hierarhiji in spremeniti nekatere, a ne vse, osnovnih virov z namestitvijo IX zaklepov na vsak vir. Dovolite sočasne IS zaklepe na najvišje nivojske vire. Na primer, zaklep SIX v tabeli postavi SIX ključavnico na tabelo (kar omogoča sočasne IS ključavnice) in IX ključavnico na trenutno spremenjeni strani (X ključavnico na spremenjeni vrstici). Medtem ko lahko ima vsak vir za določen čas le eno SIX ključavnico, da prepreči posodabljanje vira drugim transakcijam, lahko druge transakcije berejo osnovne vire v hierarhiji z pridobivanjem IS ključavnic na ravni tabele.
Ekskluzivno zaklepanje: Le program, ki izvaja zaklepanje, sme ga uporabljati, vse druge operacije na njem pa ne bodo sprejete. Ko izvedete ukaz za posodobitev podatkov, SQL Server samodejno uporabi ekskluzivno zaklepanje. Ko na objektu obstajajo druge zaklepe, mu ne morete dodati ekskluzivne ključavnice.
Deljena ključavnica: Vir, zaklenjen z deljeno ključavnico, lahko preberejo drugi uporabniki, vendar ga drugi uporabniki ne morejo spreminjati.
Zaklep posodobitve: Ko je SQL Server pripravljen na posodobitev podatkov, najprej zaklene podatkovni objekt, da podatkov ni mogoče spreminjati, lahko pa jih berejo. Ko SQL Server ugotovi, da želi posodobiti podatke, bo samodejno zamenjal zaklep posodobitve z ekskluzivnim zaklepom in ne more dodati zaklepa za posodobitev, kadar na objektu obstajajo druge zaklepe.

2 . Z vidika programerja: razdeljena je na optimistično in pesimistično ključavnico.
Optimism Lock: Za upravljanje dela ključavnice se v celoti zanaša na bazo podatkov.
Pesimistične ključavnice: Programerji upravljajo upravljanje zaklepov na podatkih ali objektih sami.
MS - SQLSERVER uporablja ključavnice za izvajanje pesimističnega nadzora sočasnosti med več uporabniki, ki hkrati izvajajo spremembe v bazi podatkov

3. Velikost delcev ključavnice
Granularnost zaklepa je velikost blokiranega cilja, majhna blokirna granularnost je visoka sočasnost, vendar je režija velika, velika granularnost blokiranja pa nizka sočasnost, vendar je režija majhna
SQL Server podpira zaklepanje granularnosti za vrstice, strani, ključe, razpone ključev, indekse, tabele ali baze podatkov
Opis vira
Identifikator vrstice RID. Uporablja se za zaklepanje vrstice v mizi posamezno.
Zaklepanje vrstice ključev v indeksu. Uporablja se za zaščito razpona ključev v serializiranih transakcijah.
8 kilobajtov (KB) podatkovnih strani ali indeksnih strani.
Razširjeni disk Nabor osmih sosednjih podatkovnih strani ali indeksnih strani.
Tabela: Celotna tabela, vključno z vsemi podatki in indeksi.
Baza podatkov.
4. Dolžina časa zaklepanja
Čas, ko je ključavnica zadržana, je čas, potreben za zaščito vira na zahtevani ravni.
Čas zadrževanja deljene ključavnice, ki se uporablja za zaščito bralnih operacij, je odvisen od ravni izolacije transakcije. Z privzeto stopnjo izolacije transakcij READ COMMITTED je deljeno zaklepanje nadzorovano le za čas trajanja strani za branje. Pri skeniranju se ključavnica ne sprosti, dokler ni zaklenjena na naslednji strani v skeniranju. Če določite poziv za HOLDLOCK ali nastavite stopnjo izolacije transakcije na REPEATABLE READ ali SERIALIZABLE, se zaklep ne sprosti, dokler se transakcija ne konča.
Glede na nastavljeno možnost sočasnosti za kazalec lahko kazalec v deljenem načinu pridobi zaklep za pomikanje, da zaščiti izvleček. Ko je potrebna zaklep zvitka, se zaklep sprosti šele, ko se kazalec naslednjič izvleče ali zapre, kar se zgodi prej. Če pa določite HOLDLOCK, se ta ne sprosti do konca transakcije.
Ekskluzivna ključavnica, uporabljena za zaščito posodobitve, ne bo sproščena do konca transakcije.
Če povezava poskuša pridobiti ključavnico, ki je v konfliktu z zaklepom, ki ga nadzoruje druga povezava, bo povezava, ki poskuša pridobiti ključavnico, blokirana, dokler:
Konfliktna ključavnica se sprosti in povezava pridobi zahtevano ključavnico.
Časovna omejitev povezave je potekla. Privzeto ni časovne omejitve, vendar nekatere aplikacije nastavijo časovne intervale, da preprečijo neomejeno čakanje

Pet prilagoditev ključavnic v SQL Serverju
1 Obvladujte zastoje in nastavite prioritete zastojev
Zastoj je neskončno čakanje, ki ga povzroči več uporabnikov, ki zaprosijo za različne blokade, saj ima vlagatelj del pravice do blokiranja in čaka na delno blokado, ki jo imajo drugi uporabniki
SET DEADLOCK_PRIORITY lahko uporabiš za nadzor, kako seja reagira v primeru zastoja. Če oba procesa zakleneta podatke in vsak proces ne more sprostiti svojega zaklepa, dokler drugi proces ne sprosti svojega, pride do zastoja.

2 Uredite timeoute in določite trajanje timeoutov.
@@LOCK_TIMEOUT V milisekundah vrne trenutno nastavitev časovne omejitve zaklepa za trenutno sejo
Nastavitev SET LOCK_TIMEOUT omogoča aplikaciji, da nastavi največji čas, ki ga stavek čaka na blokado vira. Ko je čakalni čas stavka daljši od LOCK_TIMEOUT nastavitve, sistem samodejno prekliče blokadni ukaz in aplikaciji vrne sporočilo o napaki 1222, da je bil časovni izpad zahteve za zaklepanje prekoračen

primer
V naslednjem primeru je časovna omejitev zaklepa nastavljena na 1.800 milisekund.
SET LOCK_TIMEOUT1800

3) Nastavite stopnjo izolacije transakcije.

4) Uporaba namigov za zaklepanje na ravni tabele za ukaze SELECT, INSERT, UPDATE in DELETE.

5) Konfiguracija granularnosti zaklepanja indeksa
Za nastavitev granularnosti zaklepanja za indeksiranje lahko uporabite sp_indexoption sistemske shranjene postopke

6. Oglejte si informacije o zapornici

1 Izvesti EXEC SP_LOCK poročati o ključavnici
2 Pritisni Ctrl + 2 v analizatorju poizvedb, da vidiš informacije o zaklepu

7. Previdnostni ukrepi za uporabo

Kako se izogniti zastojem
1. Pri uporabi transakcij poskušajte skrajšati logični proces obdelave transakcij in transakcije predložiti ali razveljaviti zgodaj.
2 Nastavite parameter zastoja na razumen razpon, na primer: 3 minute - 10 minut; Po izteku časa se operacija samodejno opusti, da se prepreči zastoj procesa;
3. Optimizirati program, preveriti in se izogniti pojavu zastoja;
4. Natančno testirajte vse skripte in SP-je pred natančno različico.
5 Vsi SP morajo imeti obravnavo napak (preko @error)
6 Ne spreminjajte privzete ravni SQL SERVER transakcij. Prisilno zaklepanje ni priporočljivo

Rešitev problema Kako zakleniti bazo vrstic

8. Več vprašanj o ključavnicah

1 Kako zakleniti vrstico mize
NASTAVI NIVO TRANSACTIONISOLATION READUNCOMMITTED
IZBERI *IZ tabele ROWLOCK, kjer id = 1

2 Zakleni tabelo v bazi podatkov
IZBERI *IZ TABELE WITH( HOLDLOCK )

Izjava o zaklepu:
sybase:
Tabela posodobi množico col1 = stolpec 1, kjer 1 = 0 ;
MSSQL:
Izberite Col1Iz tabele (tablockX), kjer je 1= 0 ;
oracle:
ZAKLEPNA MIZA V EKSKLUZIVNEM NAČINU ;
Ko je zaklep zaklenjen, ga nihče drug ne more uporabljati, dokler ga zaklenjeni uporabnik ne odklene, nato pa se odklene s potrditvijo ali razveljavitvijo

Nekaj primerov vam pomaga poglobiti vaš vtis
Nastavite tabelo1(A,B,C)
A B C
A1 B1 C1
A2 B2 C2
A3 B3 C3

1) Ekskluzivna ključavnica
Ustvarite dve novi povezavi
Izvedite naslednjo izjavo v prvi povezavi
Začetek TRAN
Posodobi tabelo1
set A= ' aa '
kjer je B= ' b2 '
počakaj, zamuda' 00:00:30' --počakaj 30 sekund
commit tran
Izvedite naslednjo izjavo v drugi povezavi
Začetek TRAN
izberi *iz tabele1
kjer je B= ' b2 '
commit tran

Če se zgornji dve stavki izvajata hkrati, mora poizvedba za izbiro počakati na izvedbo posodobitve, torej počakati 30 sekund

2) Skupna ključavnica
Izvedite naslednjo izjavo v prvi povezavi
Začetek TRAN
izberi *iz tabele1 holdlock - Holdlock se umetno doda locku
kjer je B= ' b2 '
počakaj, zamuda' 00:00:30' --počakaj 30 sekund
commit tran

Izvedite naslednjo izjavo v drugi povezavi
Začetek TRAN
izberite A,C iz tabele1
kjer je B= ' b2 '
Posodobi tabelo1
set A= ' aa '
kjer je B= ' b2 '
commit tran

Če se zgornji dve izjavi izvedeta hkrati, se lahko izvede izbirna poizvedba v drugi povezavi
Posodobitev mora počakati na prvo transakcijo, da sprosti skupno zaklepanje in ga pretvori v ekskluzivno zaklepanje, preden se lahko izvede, torej počaka 30 sekund

3) Zastoj
Dodana tabela2(D,E)
D E
d1 e1
D2 E2
Izvedite naslednjo izjavo v prvi povezavi
Začetek TRAN
Posodobi tabelo1
set A= ' aa '
kjer je B= ' b2 '
waitfor delay' 00:00:30'
Posodobi tabelo2
set D= ' d5 '
kjer je E= ' e1 '
commit tran

Izvedite naslednjo izjavo v drugi povezavi
Začetek TRAN
Posodobi tabelo2
set D= ' d5 '
kjer je E= ' e1 '
waitfor delay' 00:00:10'
Posodobi tabelo1
set A= ' aa '
kjer je B= ' b2 '
commit tran

Hkrati sistem zazna zastoj in proces prekine

Da dodam:
Namigi za zaklepanje na ravni tabele, ki jih podpira SQL Server 2000

HOLDLOCK hrani skupno zaklepanje, dokler ni celotna transakcija zaključena, in ga je treba sprostiti takoj, ko zaklenjeni objekt ni potreben, kar ustreza ravni izolacije transakcije SERIALIZABLE
Izjava NOLOCK se izvede brez izdaje skupnega zaklepa, kar omogoča umazana branja, kar je enako ravni izolacije transakcij READ UNCOMMITTED
PAGLOCK uporablja več zaklepov strani, kjer se uporablja ena zaklep za mizo
READPAST omogoča sql strežniku, da preskoči vse zaklenjene vrstice in izvede transakcije, za izolacijo transakcij READ UNCOMMITTED pa preskoči le RID ključavnice, ne pa zaklepov strani, con in tabel
ROWLOCK zagotavlja uporabo rowlockov
TABLOCKX zagotavlja uporabo ekskluzivne zaklepanosti na ravni tabele, ki preprečuje, da bi katera koli druga transakcija uporabljala tabelo med transakcijo
UPLOCK zahteva uporabo posodobitev pri branju tabele brez skupnega zaklepa

Zaklep aplikacije:
Aplikacijska ključavnica je ključavnica, ki jo ustvari odjemalska koda, ne pa zaklep, ki ga ustvari SQL Server sam

Dva postopka za upravljanje aplikacijskih zaklepov
sp_getapplock Zakleni aplikacijske vire
sp_releaseapplock Odklenite aplikacijske vire

Opomba: Razlika med zaklepanjem tabele v podatkovni bazi

SELECT *FROM TABLE WITH( HOLDLOCK ) Druge transakcije lahko berejo tabelo, vendar ne morejo posodabljati in brisati
SELECT *FROM TABLE WITH(TABLOCKX) Druge transakcije ne morejo prebrati, posodobiti in izbrisati tabele





Prejšnji:Ni bilo nobenega končnega poslušanja http://localhost:111/xxx.svc da bi c...
Naslednji:SQL zaklepi NOLOCK, HOLDLOCK, UPDLOCK, TABLOCK, TABLOCKX
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com