Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 13898|Atbildi: 0

[Avots] Bloķēšana, netīra lasīšana, neatkārtojama lasīšana un nepareiza lasīšana SQL

[Kopēt saiti]
Publicēts 20.07.2016 12:37:53 | | |
Slēdzeņu pārskats
1. Kāpēc ieviest slēdzenes
Ja vairāki lietotāji vienlaikus veic darbības datu bāzē, rodas šādas datu neatbilstības:
Trūkst atjauninājumu
Divi lietotāji, A un B, nolasa vienus un tos pašus datus un tos modificē, un viena lietotāja izmaiņu rezultāts iznīcina otras modifikācijas rezultātu, piemēram, biļešu rezervēšanas sistēmu
Netīra lasīšana
Lietotājs A modificē datus, un pēc tam lietotājs B nolasa datus, bet lietotājs A kāda iemesla dēļ atceļ datu modifikāciju, un dati atgriežas sākotnējā vērtībā
Nelasīt atkārtoti
Lietotājs A nolasa datus, un pēc tam lietotājs B nolasa datus un modificē tos
Galvenā vienlaicīguma kontroles metode ir bloķēšana, kas ir aizliegt lietotājiem noteiktu laiku veikt noteiktas darbības, lai izvairītos no datu neatbilstības

2. Slēdzeņu klasifikācija
Ir divi sadalījumi slēdzeņu kategorijās:
1 . No datu bāzes sistēmas viedokļa: tā ir sadalīta ekskluzīvās slēdzenēs (t.i., ekskluzīvās slēdzenēs), koplietojamās slēdzenēs un atjaunināšanas slēdzenēs
MS - SQL Server izmanto šādus resursu bloķēšanas modeļus.
Bloķēšanas režīma apraksts
Share(s) tiek izmantots operācijām, kas nemaina vai neatjaunina datus (tikai lasāmas operācijas), piemēram, SELECT priekšraksti.
Atjauninājums (U) tiek izmantots atjaunināmos resursos. Novērš bieži sastopamus strupceļus, kad tiek lasītas, bloķētas vairākas sesijas un, iespējams, var rasties resursu atjaunināšana.
Ekskluzīvs (X) tiek izmantots datu modificēšanas operācijām, piemēram, INSERT, UPDATE vai DELETE. Pārliecinieties, ka vienam un tam pašam resursam vienlaicīgi netiek veikti vairāki atjauninājumi.
Nolūka slēdzenes tiek izmantotas, lai izveidotu slēdzeņu hierarhiju. Nolūka bloķēšanas veidi ir: Intent Shared (IS), Intent Exclusive (IX) un Intent Exclusive (SIX).
Shēmas slēdzenes tiek izmantotas, veicot darbības, kas ir atkarīgas no tabulas shēmas. Shēmas slēdzeņu veidi ir: shēmas modifikācija (Sch -M) un shēmas stabilitāte (Sch -S).
Lielapjoma atjauninājumi (BU) tiek izmantoti, ja tabulā tiek kopēts liels datu apjoms un ir norādīts TABLOCK mājiens.
Koplietojamās slēdzenes
Koplietota(-u) bloķēšana ļauj vienlaicīgām transakcijām nolasīt (SELECT) resursu. Ja resursam ir koplietojama (S) bloķēšana, neviens cits darījums nevar modificēt datus. Atlaidiet resursa koplietojamo (S) bloķēšanu, tiklīdz dati ir nolasīti, ja vien transakcijas izolācijas līmenis nav iestatīts uz atkārtojamu vai augstāku, vai koplietojamā (S) bloķēšana tiek saglabāta ar bloķēšanas mājienu darījuma darbības laikā.
Atjaunināšanas bloķēšana
Atjaunināšanas (U) slēdzenes novērš strupceļus to parastajā formā. Tipisks atjaunināšanas modelis sastāv no transakcijas, kas nolasa ierakstu, iegūst resursa (lapas vai rindas) koplietojamu (S) bloķēšanu un pēc tam modificē rindu, kas prasa slēdzeni pārvērst par ekskluzīvu (X) slēdzeni. Ja divi darījumi iegūst resursa koplietošanas režīma bloķēšanu un pēc tam mēģina atjaunināt datus vienlaicīgi, viens darījums mēģina pārvērst bloķēšanu par ekskluzīvu (X) slēdzeni. Pārejai no koplietošanas režīma uz ekskluzīvo bloķēšanu ir jāgaida kāds laiks, jo viena darījuma ekskluzīvā bloķēšana nav saderīga ar cita darījuma koplietošanas režīma bloķēšanu; Notiek bloķēšanas gaidīšana. Otrais darījums mēģina iegūt ekskluzīvu (X) bloķēšanu atjaunināšanai. Strupceļš rodas, jo abi darījumi tiek pārvērsti par ekskluzīvām (X) slēdzenēm, un katrs darījums gaida, kamēr otrs darījums atbrīvos koplietojamā režīma bloķēšanu.
Lai izvairītos no šīs iespējamās strupceļa problēmas, izmantojiet atjauninātu (U) slēdzeni. Tikai viena transakcija vienlaikus var iegūt atjauninātu (U) bloķēšanu resursam. Ja transakcija modificē resursu, atjaunināšanas (U) bloķēšana tiek pārvērsta par ekskluzīvu (X) slēdzeni. Pretējā gadījumā slēdzene tiek pārvērsta par koplietojamu slēdzeni.
Ekskluzīvas slēdzenes
Ekskluzīvas (X) slēdzenes neļauj vienlaicīgiem darījumiem piekļūt resursiem. Citi darījumi nevar nolasīt vai modificēt datus, kas bloķēti ar ekskluzīvo (X) slēdzeni.
Nodoma bloķēšana
Nolūka bloķēšana norāda, ka SQL Server ir jāiegūst koplietojama (S) bloķēšana vai ekskluzīva (X) bloķēšana dažiem hierarhijas pamatā esošajiem resursiem. Piemēram, tabulas līmenī ievietota koplietošanas nolūka bloķēšana norāda, ka darījuma mērķis ir ievietot akcijas(S) bloķēšanu tabulas lapā vai rindā. Nolūka bloķēšanas iestatīšana tabulas līmenī neļauj citai transakcijai iegūt ekskluzīvu (X) bloķēšanu tabulā, kurā ir šī lapa. Nolūka bloķēšana var uzlabot veiktspēju, jo SQL Server pārbauda nolūka bloķēšanu tikai tabulas līmenī, lai noteiktu, vai transakcija var droši iegūt šīs tabulas bloķēšanu. Tā vietā, lai pārbaudītu bloķēšanu katrā tabulas rindā vai lapā, lai noteiktu, vai transakcija var bloķēt visu tabulu.
Nolūka bloķēšana ietver nolūka koplietošanu (IS), ekskluzīvu nodomu (IX) un nolūka ekskluzīvu koplietošanu (SIX).
Bloķēšanas režīma apraksts
Nolūka koplietošana (IS) norāda, ka transakcijas nolūks ir daži, nevis visi lasīšanas hierarhijas pamatā esošie resursi, katram resursam ievietojot S-slēdzenes.
Ekskluzīvs nolūks (IX) norāda, ka transakcijas nolūks ir modificēt dažus, bet ne visus hierarhijas pamatā esošos resursus, katram resursam ievietojot X-slēdzeni. IX ir IS virskopa.
Ekskluzīva koplietošana ar nodomu (SIX) norāda, ka darījuma nolūks ir nolasīt visus pamatā esošos resursus hierarhijā un modificēt dažus, bet ne visus pamatā esošos resursus, ievietojot IX slēdzenes katram resursam. Atļaut vienlaicīgu IS bloķēšanu augstākā līmeņa resursos. Piemēram, tabulas SIX bloķēšana novieto SIX bloķēšanu uz tabulas (atļaujot vienlaicīgas IS bloķēšanas) un IX bloķēšanu pašreiz modificētajā lapā (X bloķēšana modificētajā rindā). Lai gan katram resursam var būt tikai viena SIX bloķēšana uz noteiktu laiku, lai neļautu citām transakcijām atjaunināt resursu, citas transakcijas var nolasīt pamatā esošos resursus hierarhijā, iegūstot tabulas līmeņa IS slēdzenes.
Ekskluzīva bloķēšana: To drīkst izmantot tikai programma, kas veic bloķēšanas darbību, un citas darbības ar to netiks pieņemtas. Izpildot datu atjaunināšanas komandu, SQL Server automātiski izmanto ekskluzīvu bloķēšanu. Ja objektā ir citas slēdzenes, tam nevar pievienot ekskluzīvu slēdzeni.
Koplietojamā bloķēšana: resursu, kas bloķēts ar koplietojamo slēdzeni, var lasīt citi lietotāji, bet citi lietotāji to nevar modificēt.
Atjaunināšanas bloķēšana: kad SQL Server ir gatavs atjaunināt datus, tas vispirms bloķē datu objektu, lai datus nevarētu modificēt, bet tos varētu lasīt. Kad SQL Server nosaka, ka vēlas atjaunināt datus, tas automātiski aizstāj atjaunināšanas slēdzeni ar ekskluzīvu slēdzeni un nevar tai pievienot atjaunināšanas slēdzeni, ja objektā ir citas slēdzenes.

2 . No programmētāja viedokļa: tas ir sadalīts optimistiskā slēdzenē un pesimistiskajā slēdzenē.
Optimisma slēdzene: pilnībā paļaujas uz datu bāzi, lai pārvaldītu slēdzenes darbu.
Pesimistiskas slēdzenes: programmētāji paši pārvalda datu vai objektu bloķēšanas apstrādi.
MS - SQLSERVER izmanto slēdzenes, lai īstenotu pesimistisku vienlaicīguma kontroli starp vairākiem lietotājiem, kuri vienlaikus veic izmaiņas datu bāzē

3. Slēdzenes daļiņu izmērs
Bloķēšanas detalizācija ir bloķētā mērķa lielums, mazā bloķēšanas granularitāte ir augsta vienlaicīgums, bet pieskaitāmās izmaksas ir lielas, un lielā bloķēšanas granularitāte ir zema vienlaicīgums, bet pieskaitāmās izmaksas ir mazas
SQL Server atbalsta rindu, lappušu, atslēgu, atslēgu diapazonu, indeksu, tabulu vai datu bāzu bloķēšanas detalizāciju
Resursa apraksts
RID rindas identifikators. Izmanto, lai atsevišķi bloķētu rindu tabulā.
Atslēgas rindas bloķēšana indeksā. Izmanto, lai aizsargātu atslēgu diapazonu serializējamās transakcijās.
8 kilobaiti (KB) datu lappušu vai indeksa lappušu.
Paplašinātais disks Astoņu blakus esošo datu lappušu vai indeksa lappušu kopa.
Tabula Visa tabula, ieskaitot visus datus un indeksus.
DB datu bāze.
4. Bloķēšanas laika ilgums
Bloķēšanas turēšanas ilgums ir laiks, kas nepieciešams, lai aizsargātu resursu pieprasītajā līmenī.
Koplietojamās bloķēšanas aizturēšanas laiks, kas tiek izmantots, lai aizsargātu lasīšanas operācijas, ir atkarīgs no transakcijas izolācijas līmeņa. Izmantojot noklusējuma transakciju izolācijas līmeni READ COMMITTED, koplietojamā bloķēšana tiek kontrolēta tikai lasīšanas lapas laikā. Skenēšanas laikā bloķēšana netiek atbrīvota, kamēr bloķēšana nav iegūta nākamajā skenēšanas lapā. Ja norādāt HOLDLOCK uzvedni vai iestatāt transakcijas izolācijas līmeni uz REPEATABLE READ vai SERIALIZABLE, bloķēšana netiek atbrīvota līdz transakcijas beigām.
Atkarībā no kursoram iestatītās vienlaicīguma opcijas, kursors var iegūt ritināšanas bloķēšanu koplietošanas režīmā, lai aizsargātu izvilkumu. Ja ir nepieciešama ritināšanas bloķēšana, ritināšanas bloķēšana netiek atbrīvota līdz nākamajai kursora izvilkšanas vai aizvēršanas reizei, atkarībā no tā, kas notiek pirmais. Tomēr, ja norādāt HOLDLOCK, ritināšanas bloķēšana netiek atbrīvota līdz transakcijas beigām.
Ekskluzīvā bloķēšana, kas tiek izmantota atjauninājuma aizsardzībai, netiks atbrīvota līdz darījuma beigām.
Ja savienojums mēģina iegūt slēdzeni, kas ir pretrunā ar slēdzeni, ko kontrolē cits savienojums, savienojums, kas mēģina iegūt bloķēšanu, tiks bloķēts līdz:
Konfliktējošā bloķēšana tiek atbrīvota, un savienojums iegūst pieprasīto bloķēšanu.
Savienojuma taimauts ir beidzies. Pēc noklusējuma nav taimauta intervāla, bet dažas programmas iestata taimauta intervālus, lai novērstu nenoteiktu gaidīšanu

Piecas slēdzeņu pielāgošana SQL Server
1 Rīkojieties ar strupceļiem un iestatiet strupceļa prioritātes
Strupceļš ir bezgalīga gaidīšana, ko izraisa vairāki lietotāji, kas piesakās dažādiem blokiem, jo pieteikuma iesniedzējam ir daļa no bloķēšanas tiesībām un gaida daļēju bloķēšanu, kas pieder citiem lietotājiem
Varat izmantot DEADLOCK_PRIORITY SET, lai kontrolētu, kā sesija reaģē strupceļa stāvokļa gadījumā. Ja abi procesi bloķē datus un katrs process nevar atbrīvot savu bloķēšanu, kamēr otrs process neatbrīvo savu bloķēšanu, rodas strupceļa situācija.

2 Rīkojieties ar taimautu un iestatiet bloķēšanas taimauta ilgumu.
@@LOCK_TIMEOUT Atgriež pašreizējo bloķēšanas taimauta iestatījumu pašreizējai sesijai milisekundēs
Iestatījums SET LOCK_TIMEOUT ļauj lietojumprogrammai iestatīt maksimālo laiku, kas priekšraksts gaida, lai bloķētu resursu. Ja pārskata gaidīšanas laiks ir lielāks par LOCK_TIMEOUT iestatījumu, sistēma automātiski atceļ bloķēšanas paziņojumu un atgriež lietojumprogrammai kļūdas ziņojumu 1222, ka bloķēšanas pieprasījuma taimauta periods ir pārsniegts

piemērs
Nākamajā piemērā bloķēšanas taimauta periods ir iestatīts uz 1 800 milisekundēm.
IESTATĪT LOCK_TIMEOUT1800

3) Iestatiet darījuma izolācijas līmeni.

4) Izmantojiet tabulas līmeņa bloķēšanas padomus SELECT, INSERT, UPDATE un DELETE paziņojumiem.

5) Konfigurējiet indeksa bloķēšanas detalizāciju
Varat izmantot sp_indexoption sistēmas saglabātās procedūras, lai iestatītu indeksēšanas bloķēšanas detalizāciju

6. Apskatiet slēdzenes informāciju

1 Veiciet EXEC SP_LOCK ziņojiet par informāciju par slēdzeni
2 Nospiediet Ctrl + 2 vaicājumu analizatorā, lai redzētu slēdzenes informāciju

7. Piesardzības pasākumi lietošanā

Kā izvairīties no strupceļa
1. Izmantojot darījumus, mēģiniet saīsināt darījumu loģisko apstrādes procesu un iesniegt vai atcelt darījumus agrāk.
2 Iestatiet strupceļa taimauta parametru saprātīgā diapazonā, piemēram: 3 minūtes - 10 minūtes; Pēc laika operācija tiks automātiski pārtraukta, lai izvairītos no procesa karāšanās;
3. Optimizējiet programmu, pārbaudiet un izvairieties no strupceļa parādības;
4. Rūpīgi pārbaudiet visus skriptus un SP pirms precīzas versijas.
5 Visiem SP ir jābūt kļūdu apstrādei (izmantojot @error)
6 Nemainiet SQL SERVER transakciju noklusējuma līmeni. Piespiedu bloķēšana nav ieteicama

Atrisināt problēmu Kā bloķēt rindu tabulas datu bāzi

8. Vairāki jautājumi par slēdzenēm

1 Kā bloķēt tabulas rindu
IESTATĪT TRANSAKCIJASIZOLĀCIJAS LĪMENI READUNCOMMITTED
SELECT *FROM tabula ROWLOCKWHERE id = 1

2 Bloķējiet tabulu datu bāzē
SELECT *FROM table WITH( HOLDLOCK )

Slēdzenes paziņojums:
sybase:
atjaunināt tabulas kopu col1 = col1 kur1 = 0 ;
MSSQL:
izvēlieties col1no tabulas (tablockx)kur 1= 0 ;
oracle:
BLOĶĒT GALDA GALDU EKSKLUZĪVĀ REŽĪMĀ;
Pēc bloķēšanas neviens cits to nevar darbināt, kamēr bloķētais lietotājs to neatbloķē, un tas tiek atbloķēts ar saistību vai atcelšanu

Daži piemēri palīdz padziļināt iespaidu
Iestatīt galdu1 (A, B, C)
A B C
A1 B1 C1
A2 B2 C2
A3 B3 C3

1) Ekskluzīva slēdzene
Divu jaunu savienojumu izveide
Pirmajā savienojumā izpildiet šādu paziņojumu
sākt tran
Atjaunināt tabulu1
set A = ' aa '
kur B = ' b2 '
waitfor delay' 00:00:30' --wait 30 seconds
veikt tran
Otrajā savienojumā izpildiet šādu paziņojumu
sākt tran
Izvēlieties *no tabulas1
kur B = ' b2 '
veikt tran

Ja iepriekš minētie divi paziņojumi tiek izpildīti vienlaicīgi, atlases vaicājumam jāgaida, līdz tiks izpildīts atjauninājums, tas ir, jāgaida 30 sekundes

2) Koplietošanas slēdzene
Pirmajā savienojumā izpildiet šādu paziņojumu
sākt tran
select *from table1 holdlock - aizturēšanas slēdzene tiek mākslīgi pievienota slēdzenei
kur B = ' b2 '
waitfor delay' 00:00:30' --wait 30 seconds
veikt tran

Otrajā savienojumā izpildiet šādu paziņojumu
sākt tran
izvēlieties A,C no tabulas1
kur B = ' b2 '
Atjaunināt tabulu1
set A = ' aa '
kur B = ' b2 '
veikt tran

Ja iepriekš minētie divi paziņojumi tiek izpildīti vienlaicīgi, var izpildīt atlases vaicājumu otrajā savienojumā
Atjauninājumam jāgaida pirmais darījums, lai atbrīvotu koplietojamo slēdzeni un pārvērstu to par ekskluzīvu slēdzeni, tas ir, pagaidiet 30 sekundes

3) Strupceļš
Pievienota tabula2 (D, E)
D E
d1 e1
d2 e2
Pirmajā savienojumā izpildiet šādu paziņojumu
sākt tran
Atjaunināt tabulu1
set A = ' aa '
kur B = ' b2 '
gaidīt kavēšanos" 00:00:30'
Atjaunināt tabulu2
set D = ' d5 '
kur E = ' e1 '
veikt tran

Otrajā savienojumā izpildiet šādu paziņojumu
sākt tran
Atjaunināt tabulu2
set D = ' d5 '
kur E = ' e1 '
gaidīt kavēšanos" 00:00:10'
Atjaunināt tabulu1
set A = ' aa '
kur B = ' b2 '
veikt tran

Tajā pašā laikā sistēma atklāj strupceļu un pārtrauc procesu

Pievienot:
SQL Server 2000 atbalstītie tabulas līmeņa bloķēšanas padomi

HOLDLOCK saglabā koplietojamo bloķēšanu, līdz visa transakcija ir pabeigta, un tā ir jāatlaiž, tiklīdz bloķētais objekts nav nepieciešams, kas ir vienāds ar SERIALIZABLE transakcijas izolācijas līmeni
NOLOCK priekšraksts tiek izpildīts, neizsniedzot koplietojamu slēdzeni, pieļaujot netīrus lasījumus, kas ir vienādi ar READ UNCOMMITTED darījumu izolācijas līmeni
PAGLOCK izmanto vairākas lappušu bloķēšanas, kur tiek izmantota viena tabulas bloķēšana
READPAST ļauj sql serverim izlaist visas bloķētās rindas un izpildīt transakcijas, un READ UNCOMMITTED transakciju izolācijas līmeņiem izlaist tikai RID slēdzenes, nevis lapas, zonas un tabulas bloķēšanas
ROWLOCK piespiež airu slēdzenes izmantošanu
TABLOCKX ievieš ekskluzīvas tabulas līmeņa bloķēšanas izmantošanu, kas neļauj jebkuram citam darījumam izmantot tabulu darījuma laikā
UPLOCK piespiež izmantot atjauninājumus, lasot tabulu bez koplietojamas bloķēšanas

Lietotnes bloķēšana:
Lietojumprogrammas bloķēšana ir klienta koda ģenerēta slēdzene, nevis paša SQL Server ģenerēta bloķēšana

Divi procesi lietojumprogrammu slēdzeņu apstrādei
sp_getapplock bloķēšanas lietojumprogrammu resursi
sp_releaseapplock Lietojumprogrammu resursu atbloķēšana

Piezīme: Atšķirība starp tabulas bloķēšanu datu bāzē

SELECT *FROM table WITH( HOLDLOCK ) Citas transakcijas var nolasīt tabulu, bet nevar atjaunināt un izdzēst
SELECT *FROM table WITH(TABLOCKX) Citi darījumi nevar nolasīt, atjaunināt un izdzēst tabulu





Iepriekšējo:Nebija galapunkta, kas klausījās http://localhost:111/xxx.svc, ka c ...
Nākamo:SQL slēdzenes NOLOCK, HOLDLOCK, UPDLOCK, TABLOCK, TABLOCKX
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com