Sunteți pe pagina 1din 10

Capitolul 7: Accesul concurent la date i pstrarea

consistenei acestora
Baza de date Oracle permite acces concurent, adic poate fi accesat simultan de mai muli
utilizatori n cadrul mai multor sesiuni de lucru. O problem fundamental ntr-o baz de date cu
acces concurent este pstrarea consistenei datelor Aceasta nseamn pe de o parte c n cadrul
fiecrei sesiuni de lucru, utilizatorul trebuie s aib o vedere consistent asupra bazei de date,
incluznd modificrile vizibile fcute de ctre ali utilizatori, iar pe de alt parte Oracle trebuie s
mpiedice modificrile incorecte ale datelor, care ar putea compromite interitatea acestora.
!odalitatea cea mai simpl de a estiona problema accesului concurent la date ar fi ca fiecare
utilizator s-"i a"tepte rndul pentru a accesa baza de date. #vident, aceast soluie este total
neconvenabil, scopul unui $%B& fiind de a reduce aceste a"teptri astfel nct ele s fie ine'istente
sau neli(abile pentru ali utilizatori. )u alte cuvinte, nu se pot face compromisuri nici n ceea ce
prive"te consistena datelor, dar nici n ceea ce prive"te performanele sistemului. !ecanismul prin
care Oracle estioneaz accesul concurent la date folose"te un model de consisten multiversiune "i
diverse tipuri de blocri, care vor fi discutate mai trziu n acest capitol. Aceste mecanisme au la
baz conceptul de tranzacie.
7.1 Tranzaciile i asigurarea consistenei la scriere
)onceptul de tranzacie este fundamental pentru modul n care Oracle asiur consistena datelor. O
tranzacie este alctuit din una sau mai multe instruciuni $*+. O tranzacie este cea mai mic
unitate de lucru n Oracle, n sensul c pentru orice tranzacie, fie sunt e'ecutate toate sc,imbrile
fcute bazei de date de ctre tranzacie, fie nu este e'ecutat nici una dintre modificri. )u alte
cuvinte, o tranzacie nu poate fi e'ecutat parial. +a sfr"itul unei tranzacii, sc,imbrile fcute bazei
de date sunt fie permanentizate (commited), fie sunt anulate, n acest ultim caz spunndu-se c
tranzacia a fost derulat napoi -rolled back). &up ce o tranzacie a fost permanentizat sau
derulat napoi, urmtoarea tranzacie va ncepe cu urmtoarea instruciune $*+.
.n timpul e'ecutrii unei tranzacii, modificrile fcute asupra bazei de date de ctre acestea nu sunt
vizibile altor sesiuni de lucru. &ac tranzacia este permanentizat, atunci sc,imbrile fcute de
aceasta devin vizibile pentru alte sesiuni care ncep dup permanentizarea acesteia. &ac tranzacia
este derulat napoi, atunci modificrile asupra datelor efectuate de ctre aceasta sunt anulate, astfel
nct datele afectate vor rmne nesc,imbate, ca "i cnd instruciunile $*+ din tranzacie nu au fost
niciodat e'ecutate.
$ lum de e'emplu o baz de date a unei bnci. )nd un client transfer o suma de bani dintr-un
cont de depozit ntr-un cont curent, tranzacia poate s conin trei operaii separate/ retraerea
sumei din contul de depozit, depunerea sumei n contul curent "i nreistrarea operaiunii ntr-un
(urnal/
UPDATE cont_depozit
SET balanta = balanta - 700
WHERE nr_cont = 8740!
UPDATE cont_depozit
SET balanta = balanta " 700
WHERE nr_cont = 874!
#$SERT #$T% &'rnal(nr_operati'ne) *'+a) cont_debitor)
cont_creditor,
-A.UES (&'rnal_*e/0$E1T-A.) 700) 8740) 874,!
012
2%33#T!
3entru a asiura corectitudinea datelor, Oracle trebuie s aranteze c toate cele trei operaii sunt
efectuate. &ac ceva nea"teptat, de e'emplu o defeciune ,ard, mpiedic e'ecutarea uneia dintre
instruciuni, atunci celelalte instruciuni ale tranzaciei trebuiesc anulate, adic tranzacia trebuie
derulat napoi. &eci, dac una dintre instruciuni nu se poate e'ecuta cu succes, atunci celelalte
trebuiesc anulate pentru a menine consistena bazei de date.
O tranzacie ncepe cu prima comand e'ecutabil $*+ "i se nc,eie cnd apare una dintre
urmtoarele comenzi sau evenimente/
2%33#T 4W%R56 sau R%..7A25 4W%R56. )omanda 2%33#T sau 2%33#T W%R5
permanentizeaz modificrile fcute de ctre tranzacie. )omanda R%..7A25 sau R%..7A25
W%R5 deruleaz napoi tranzacia4
o comand &&+ -2REATE)A.TER)DR%P5. &eci orice comand &&+ este implicit
permanentizat, astfel nct orice tranzacie nu poate conine dect cel mult o comand &&+4
sfr"itul sesiunii curente de lucru, n acest caz fcndu-se implicit o permanentizare4
defeciune ,ard sau soft, caz n care tranzacia este derulat napoi pentru recuperarea datelor
-rollbac6 on recover75 "i pstrarea interitii acestora.
&up terminarea tranzaciei, urmtoarea comand e'ecutabil $*+ va ncepe n mod automat o nou
tranzacie.
7.1.1 Comanda AUTOCOMMIT
&ac se folose"te utilitarul $*+83lus, e'ist posibilitatea ca dup fiecare comand &!+ s aib loc
o permanentizare automat a datelor -un 2%33#T implicit5. Acest lucru se poate realiza folosind
comanda $*+ SET AUT%42%33#T6, avnd sinta'a/
SET AUT%42%33#T6 4%$8%996
.n cazul folosirii acestei comenzi cu opiunea %$ -SET AUT% %$ sau SET AUT%2%33#T %$5 o
tranzacie nu va putea conine dect cel mult o sinur comand &!+, iar instruciunea R%..7A25
nu va mai avea nici un efect, datele fiind permanentizate implicit ori de cte ori este e'ecutat o
comand &!+. 3ermanentizarea implicit a unei comenzi &!+ este anulat la e'ecutarea comenzii
SET AUT%42%33#T6 cu opiunea %99 -SET AUT% %99 sau SET AUT%2%33#T %995.
7.1. !uncte de sal"are
.n cazul tranzaciilor mai luni, care conin multe instruciuni $*+, pentru a mpri tranzacia n
pri mai mici, pot fi declarai delimitatori intermediari, numite puncte de salvare -savepoints5. 9n
punct de salvare poate fi declarat folosind comanda SA-EP%#$T, avnd sinta'a/
SA-EP%#$T nume:punct:salvare.
&eclararea unor puncte de salvare n interiorul unei tranzacii permite posibilitatea ca la un moment
ulterior s fie derulate napoi toate instruciunile e'ecutate ncepnd cu un punct de salvare
specificat. Acest lucru se poate face cu comanda R%..7A25 sau R%..7A25 W%R5 cu specificaia
T% 4SA-EP%#$T;/
R%..7A25 4W%R56 T% 4SA-EP%#$T6 n'+e_p'nct_*al:are
&e e'emplu, s considerm urmtoarea secven de comenzi $*+/
0<=
#$SERT #$T% departa+ent (cod_dept) cod_tara) n'+e_dept,
-A.UES (dept_*e/0$E1T-A.) 40) ;Proiectare;,!
SA-EP%#$T al<a!
#$SERT #$T% departa+ent (cod_dept) cod_tara) n'+e_dept,
-A.UES (dept_*e/0$E1T-A.) 40) ;-anzari;,!
SA-EP%#$T beta!
#$SERT #$T% departa+ent (cod_dept) cod_tara) n'+e_dept,
-A.UES (dept_*e/0$E1T-A.) 40) ;#T;,!
.n acest punct, anularea celei de-a treia inserri n tabelul departa+ent se poate face folosind
comanda/
R%..7A25 T% beta!
Anularea ultimelor dou inserri se poate face folosind comanda/
R%..7A25 T% al<a!
Anularea tuturor celor trei inserri "i nc,eierea tranzaciei se face folosind comanda/
R%..7A25!
7. Asigurarea consistenei cu a#utorul tranzaciilor
>ranzaciile furnizeaz utilizatorului bazei de date sau dezvoltatorului de aplicaii capacitatea de a
aranta consistena modificrilor operate asupra datelor. 3entru a asiura aceast consisten,
comenzile $*+ trebuie s fie rupate n mod loic n tranzacii. O tranzacie trebuie s fie o unitate
loic de lucru, nici mai mult, nici mai puin. &atele din baza de date trebuie s fie consistente nainte
de nceperea tranzaciei "i la sfr"itul acesteia. .n plus, o tranzacie trebuie s cuprind doar o sinur
modificare consistent a datelor.
&e e'emplu, s considerm e'emplul transferului bancar de la nceputul acestei seciuni. )ele trei
aciuni efectuate -retraerea sumei din contul de depozit, depunerea ei n contul curent "i
nreistrarea n (urnal5 trebuiau fie s fie toate e'ecutate, fie nici una. 3entru a asiura consistena
datelor, orice alt aciune fr letur cu operaiunea dat -de e'emplu, un nou depozit ntr-un alt
cont5 nu trebuie inclus n aceea"i tranzacie.
7..1 Modelul multi"ersiune i consistena la citire
!odelul multiversiune, furnizat de ctre Oracle, asiur consistena la citire -read consistency5,
adic/
%aranteaz c setul de date vzut de orice instruciune $*+ este consistent "i nu se sc,imb n
timpul e'ecuiei unei instruciuni4 cu alte cuvinte - se spune c Oracle asiur o consisten la
citire la nivel de instruciune4
Operaiile de citire -SE.E2T5 nu trebuie s vad datele care sunt n proces de sc,imbare4
Operaiile de scriere -#$SERT, UPDATE, DE.ETE5 nu trebuie s afecteze consistena datelor "i
s ntrerup sau s intre n conflict cu alte operaii de scriere concurente.
0<0
)ea mai simpl modalitate de a ne imaina un sistem care asiur consistena la citire este de ne
nc,ipui c fiecare utilizator opereaz asupra unei copii proprii a bazei de date - de unde "i numele de
model multiversiune.
7.. Implementarea modelului multi"ersiune
)onsistena la citire este implementat de ctre Oracle prin pstrarea unei copii a datelor n
sementele de revenire. )nd este efectuat o operaie de #$SERT, UPDATE sau DE.ETE asupra
unui tabel, Oracle va face o copie a datelor nainte ca acestea s se modifice ntr-un sement de
revenire. >oate operaiile de citire efectuate asupra tabelului n alte sesiuni de lucru vor vedea datele
a"a cum erau ele nainte de sc,imbare - deci vor vedea datele din sementul de revenire. .nainte ca
datele fie permanentizate -prin 2%33#T e'plicit sau implicit5, doar utilizatorul din sesiunea curent
va vedea datele modificate, toi ceilali vor vedea datele din sementul de revenire. &ac sc,imbrile
sunt permanentizate, atunci ele vor deveni vizibile "i pentru ceilali utilizatori. .n acest caz, spaiul
ocupat de datele vec,i n sementul de revenire este eliberat "i poate fi utilizat din nou. &ac
tranzacia este derulat napoi -prin R%..7A25 sau n cazul unei defeciuni5 atunci datele din
sementul de revenire sunt scrise napoi n baza de date, iar ceilali utilizatori vd n continuare datele
iniiale, ca "i cum modificrile fcute de ctre tranzacie nu s-ar fi efectuat.
7..$ Tranzacii de citire i consistena la citire la ni"el de tranzacie
.n mod implicit consistena la citire asiurat de ctre Oracle este la nivel de instruciune, adic
datele nu se sc,imb n timpul efecturii unei instruciuni. .n acest caz, putem avea, n cadrul
aceleia"i sesiuni de lucru, dou interori identice care produc rezultate diferite - aceasta se poate
ntmpla dac ntre cele dou interori au fost permanentizate sc,imbrile fcute de ctre o alt
tranzacie. .n anumite situaii ns, dac o tranzacie cuprinde mai multe interori, se poate dori ca
toate aceste interori s aib o vedere consistent asupra datelor n raport cu acela"i moment de
timp. )u alte cuvinte, interorile din aceast tranzacie nu vor simi efectul permanentizrilor fcute
de ctre alte tranzacii dup nceperea tranzaciei curente. .n acest caz se spune c tranzacia este de
citire -read onl7 transaction5 iar consistena la citire asiurat de ctre Oracle este la nivel de
tranzacie -transaction-level read consistenc75. )onsistena la citire la nivel de tranzacie este
implementat similar cu cea la nivel de instruciune, adic folosind semente de revenire.
3entru a ncepe o tranzacie de citire se folose"te comanda SET TRA$SA2T#%$ READ %$.=.
Aceast comand trebuie s fie prima instruciune din tranzacie. &up e'ecutarea acestei
instruciuni, toate permanentizrile fcute de ctre alte tranzacii nu vor fi vizibile n tranzacia
curent. O tranzacie de citire nu poate conine dect interori -instruciuni SE.E2T54 comenzile
&!+ nu sunt permise iar comanda SE.E2T ... 9%R UPDATE va produce o eroare. O tranzacie de
citire se va termina atunci cnd se vor e'ecuta comenzile 2%33#T 4W%R56, R%..7A25 4W%R56
sau la e'ecutarea unei comenzi &&+ - deoarece o comand &&+ realizeaz un 2%33#T implicit. .n
timpul unei tranzacii de citire, ali utilizatori pot continua s intero,eze "i s modifice datele.
7.$. %locri
Blocrile -loc6s5 sunt folosite de Oracle pentru a asiura interitatea datelor, permind n acela"i
timp accesul concurent la date de ctre un numr infinit de utilizatori.
.n principal, blocrile folosite de Oracle sunt de dou feluri/
Blocri de date sau blocri DML/ Aceste blocri prote(eaz datele "i le vom discuta pe lar n
aceast seciune.
Blocri de dicionar sau blocri DDL/ Acestea prote(eaz definiia unui obiect al sc,emei -de
e'emplu a unui tabel5 n timp ce o operaia &&+ acioneaz asupra acestuia sau face referire la
acesta -dup cum am menionat nainte, fiecare operaie &&+ permanentizeaz implicit tranzacia
0<?
din care face parte, astfel nct blocarea este necesar doar pe durata unei astfel de operaii5. &e
e'emplu, dac un utilizator creeaz o procedur atunci toate obiectele la care se face referin n
acea procedur vor fi blocate, prevenindu-se modificarea sau distruerea lor nainte de nc,eierea
compilrii procedurii.
)omenzile $*+ de interoare -SE.E2T fr clauza 9%R UPDATE5 nu provoac nici un fel de
blocare.
&in punct de vedere al resursei blocate, blocrile &!+ pot fi de dou feluri/
blocri la nivel de rnd, atunci cnd blocarea afecteaz un sinur rnd
blocri la nivel de tabel, atunci cnd blocarea afecteaz ntre tabelul
&in punct de vedere al modului de declan"are a blocrii, blocrile &!+ sunt de dou feluri
@mplicite, atunci cnd blocarea este fcut n mod automat de ctre Oracle n urma efecturii
unor operaii de #$SERT, UPDATE sau DE.ETE "i nu necesit nici o aciune din partea
utilizatorului. Andul asupra cruia se efectueaz o astfel de operaie este blocat pentru evitarea
unor alte operaii &!+ simultane asupra sa.
#'plicite, atunci cnd ele apar ca urmare a e'ecutrii de ctre utilizator a urmtoarelor comenzi
$*+
SE.E2T c' cla'za 9%R UPDATE
.%25 TA7.E
O blocare a unei resurse este obinut de ctre o tranzacie, deci blocarea va fi eliberat la nc,eierea
tranzaciei. &eci toate blocrile obinute n timpul unei tranzacii sunt eliberate atunci cnd tranzacia
este permanentizat sau derulat napoi. .n plus, toate blocrile obinute dup un punct de salvare
sunt eliberate atunci cnd tranzacia este derulat napoi pn la acel punct de salvare.
7.$.1 %locri la ni"el de r&nd
Blocrile la nivel de rnd apar n mod implicit la efectuarea unor operaii de #$SERT, UPDATE "i
DE.ETE, ct "i n mod e'plicit la e'ecutarea comenzii SE.E2T cu clauza 9%R UPDATE. .n aceast
seciune ne vom referi la blocrile implicite la nivel de rnd, comanda SE.E2T > 9%R UPDATE
urmnd s fie prezentat mai trziu.
.n momentul efecturii unor operaii de #$SERT, UPDATE sau DE.ETE asupra datelor, rndul sau
rndurile afectate de aceste operaii sunt blocate. Blocarea se efectueaz la nivel de rnd, adic la
nivelul cel mai de (os posibil, "i nu la nivel de tabel, asiurndu-se astfel cel mai bun acces concurent
posibil. )ombinaia ntre modelul multiversiune descris mai sus "i blocrile la nivel de rnd asiur
faptul c utilizatorii nu intr n competiie pentru date dect dac ncearc accesarea aceluia"i rnd.
!ai precis, mecanismul folosit de Oracle pentru estionarea concurenei asiur urmtoarele/
Operaiile de citire -SE.E2T5 nu trebuie s a"tepte pn la terminarea operaiilor de scriere
-#$SERT, UPDATE, DE.ETE5 sau a altor operaii de citire efectuate asupra acelora"i rnduri.
Operaiile de scriere nu trebuie s a"tepte pn la terminarea operaiilor de citire efectuate asupra
acelora"i rnduri, cu e'cepia situaiei cnd acest lucru este cerul e'plicit de o comand SE.E2T
> 9%R UPDATE
Operaiile de scriere trebuie doar s a"tepte pentru alte operaii de scriere care ncerc s modifice
acelea"i rnduri n tranzacii concurente.
+a nivel de rnd, blocrile se pot face numai n modul exclusiv -B5, adic un utilizator nu poate
modifica un rnd pn ce tranzacia care l-a blocat s-a terminat -prin permanentizare sau derulare
napoi5.
0<C
&ac o tranzacie obine o blocare pentru un rnd, atunci ea obine "i o blocare la nivel de tabel
pentru tabelul corespunztor. O blocare la nivel de tabel este de asemenea necesar pentru a preveni
operaii &&+ care ar interaciona cu modificrile de date din tranzacia curent. 9rmtoarea seciune
e'plic blocrile la nivel de tabel.
7.$.. %locrile la ni"el de ta'el
O tranzacie obine o blocare la nivel de tabel n mod implicit atunci cnd asupra tabelului este
e'ecutat una dintre comenzile #$SERT, UPDATE sau DE.ETE sau n mod e'plicit, prin comenzile
SE.E2T > 9%R UPDATE "i .%25 TA7.E. Blocrile la nivel de tabel au urmtoarele dou scopuri/
rezervarea accesului la tabel pentru tranzacia curent "i prevenirea de operaii &&+ care ar intra n
conflict cu aceast tranzacie D de e'emplu, asupra unui tabel nu pot fi e'ecutate operaiile A.TER
sau DR%P dac e'ist o tranzacie neterminat care deine asupra acestuia o blocare la nivel de tabel.
Blocrile la nivel de tabel pot fi fcute n mai multe moduri, n funcie de caracterul mai mult sau mai
puin restrictiv al blocrii/
RS - roE s,are
R1 - roE e'clusive
S - s,are
SR1 - s,are roE e'clusive
1 - e'clusive
!odul de blocare al unui tabel determin modurile n care alte tranzacii pot bloca acela"i tabel.
#numerarea de mai sus este fcut n ordinea cresctoare a caracterului restrictiv al modului de
blocare, de la cel mai puin restrictiv -RS5 la cel mai restrictiv -15. .n continuare trecem n revist
fiecare dintre aceste moduri, artnd aciunile care produc modul respectiv de blocare "i ce aciuni
sunt permise sau nu n alte tranzacii concurente cu tranzacia care deine blocarea.
Mod de blocare RS la nivel de tabel
O blocare n mod RS la nivel de tabel arat c tranzacia care bloc,eaz tabelul a blocat rnduri din
tabel "i intenioneaz s le modifice. O blocare n mod RS se obine la e'ecutarea comenzilor
SE.E2T cu clauza 9%R UPDATE "i .%25 TA7.E cu opiunea R%W SHARE. !odul de blocare RS
este cel mai puin restrictiv dintre toate modurile de blocare, permind radul cel mai mare de acces
concurent pentru un tabel.
Operaii permise/ O blocare n mod RS permite acces -SE.E2T, #$SERT, UPDATE, DE.ETE5
concurent la tabel "i blocarea concurent a tabelului de ctre alt tranzacie n orice mod, n afara de
cel 1.
Operaii nepermise/ O blocare n mod RS nu permite altor tranzacii concurente de a bloca tabelul n
mod 1.
Mod de blocare RX la nivel de tabel
O blocare n mod R1 la nivel de tabel arat n eneral c tranzacia care deine blocarea a fcut una
sau mai multe modificri asupra rndurilor din tabel. O blocare n mod R1 este obinut la e'ecutarea
comenzilor &!+ -#$SERT, UPDATE "i DE.ETE5 "i a comenzii .%25 TA7.E cu opiunea R%W
E12.US#-E. Blocarea n mod R1 este ceva mai restrictiv dect blocarea n mod RS.
Operaii permise/ O blocare n mod R1 permite acces -SE.E2T, #$SERT, UPDATE, DE.ETE5
concurent la tabel "i blocarea concurent a tabelului de ctre alt tranzacie n modurile RS "i R1.
0<F
Operaii nepermise/ O blocare n mod R1 nu permite altor tranzacii concurente de a bloca tabelul n
modurile 1, SR1 "i S.
Mod de blocare S la nivel de tabel
O blocare n mod S este obinut la e'ecutarea comenzii .%25 TA7.E cu opiunea SHARE.
Operaii permise/ O blocare n mod S permite altor tranzacii doar interoarea -SE.E2T5 tabelului
"i blocarea sa n modurile S "i RS.
Operaii nepermise/ O blocare n mod S nu permite altor tranzacii concurente de a efectua operaii
de #$SERT, UPDATE sau DE.ETE "i de a bloca tabelul n modurile SR1 "i 1.
Mod de blocare SRX la nivel de tabel
!odul de blocare SR1 este mai restrictiv dect cel S. O blocare n mod SR1 este obinut la
e'ecutarea comenzii .%25 TA7.E cu opiunea SHARE R%W E12.US#-E.
Operaii permise/ O blocare n mod SR1 permite altor tranzacii doar interoarea -SE.E2T5
tabelului "i blocarea sa n modul RS. Asupra unui tabel nu poate deine simultan blocri n modul
SR1 dect cel mult o sinur tranzacie.
Operaii nepermise/ O blocare n mod SR1 nu permite altor tranzacii concurente de a efectua
operaii de #$SERT, UPDATE sau DE.ETE "i de a bloca tabelul n orice mod n afara de RS.

Mod de blocare X la nivel de tabel
!odul de blocare 1 este cel mai restrictiv mod de blocare. O blocare n mod 1 este obinut la
e'ecutarea comenzii .%25 TA7.E cu opiunea E12.US#-E.
Operaii permise/ O blocare n mod SR1 permite interoarea altor tranzacii doar interoarea
-SE.E2T5 tabelului. Asupra unui tabel nu poate deine simultan blocri n modul SR1 dect cel mult
o sinur tranzacie.
Operaii nepermise/ O blocare n mod SR1 nu permite altor tranzacii concurente de a efectua
operaii de #$SERT, UPDATE sau DE.ETE "i de a bloca tabelul n orice mod.
9rmtorul tabel rezum modul de blocare implicit precum "i posibilitatea e'istenei simultane a mai
multor tipuri de blocare la nivel de tabel, n urma e'ecutrii comenzilor $*+ corespunztoare/
Comanda ()* Mod de
'locare
implicit
Moduri de 'locare permise
simultan
+( +, ( (+, ,
$#+#)> fr clauza GOA 93&A># Hici unul &a &a &a &a &a
@H$#A> AB &a &a Hu Hu Hu
93&A># AB &a8 &a8 Hu Hu Hu
&#+#># AB &a8 &a8 Hu Hu Hu
$#+#)> cu clauza GOA 93&A># A$ &a8 &a8 &a8 &a8 Hu
+O)I >AB+# J n AOK $LAA# !O&# A$ &a &a &a &a Hu
+O)I >AB+# J n AOK #B)+9$@M# !O&# AB &a &a Hu Hu Hu
+O)I >AB+# J n $LAA# !O&# $ &a Hu &a Hu Hu
+O)I >AB+# J n AOK $LAA# #B)+9$@M# $AB &a Hu Hu Hu Hu
0<1
!O&#
+O)I >AB+# J n #B)+9$@M# !O&# B Hu Hu Hu Hu Hu
&a8 N &a, dac nu e'ist alt tranzacie care deine blocri la nivel de rnd care intr n conflict cu blocarea la nivel
de rnd produs de aceast comand $*+4 n caz contrar, tranzacia va a"tepta eliberarea acestor blocri la nivel de
rnd.
.n eneral, blocarea implicit la nivel de rnd este suficient n aplicaii. >otu"i, a"a cum am
menionat mai devreme, blocarea se poate face "i n mod implicit, folosind comanda SE.E2T cu
clauza 9%R UPDATE -la nivel de rnd "i tabel5 "i comanda .%25 TA7.E -la nivel de tabel5. Acestea
sunt prezentate n urmtoarele dou seciuni.
7.$.$. Comanda (-*-CT cu clauza .O+ U!/AT-
Golosirea clauzei 9%R UPDATE ntr-o comand SE.E2T determin blocarea rndurilor selectate n
modul 1 "i blocarea ntreului tabel sau tabelelor pe care se face interoarea n modul RS. &eci
comanda SE.E2T cu clauza 9%R UPDATE nu modific rndurile selectate ci doar le bloc,eaz.
Aceast comand este foarte folositoare pentru aducerea unui rnd mai devreme ntr-o tranzacie,
nainte de a-l actualiza. +a actualizarea rndurilor -prin comanda UPDATE5 blocarea la nivel de rnd
rmne nesc,imbat n timp ce modul de blocare al tabelului devine R1.
$inta'a acestei comenzi este urmtoarea/
SE.E2T lista:coloane
9R%3 tabel 4)tabel6 >0
WHERE condiie
9%R UPDATE 4%9 coloana 4)coloana6 >6 4$%WA#T6
&ac se specific $%WA#T "i rndul sau rndurile selectate sunt de(a blocate de alt tranzacie,
atunci utilizatorul este n"tiinat de acest lucru, returnndu-i-se controlul. &ac $%WA#T nu este
specificat, atunci comanda a"teapt pn cnd rndul este deblocat.
$ lum de e'emplu, tranzacia urmtoare/
SE.E2T *alari'
9R%3 *alariat
WHERE cod_*alariat = 0?
9%R UPDATE %9 *alari' $%WA#T!
UPDATE *alariat
SET *alari' = @A00
WHERE cod_*alariat = 0?!
2%33#T!
Atunci, la e'ecutarea primei comenzi, rndul cu cod:salariat N ? este blocat n mod 1 n timp ce
tabelul salariat este blocat n mod RS. +a e'ecutarea celei de-a doua comenzi, blocarea la nivel de
rnd se menine n timp ce blocarea la nivel de tabel este sc,imbat n modul R1. +a e'ecutarea
instruciunii 2%33#T, tranzacia este permanentizat "i toate blocrile sunt eliberate.
7.$.0 Comanda *OC1 TA%*-
9nul sau mai multe tabele pot fi blocate n oricare din modurile prezentate mai sus folosind comanda
.%25 TA7.E, avnd sinta'a/
0<<
.%25 TA7.E nume:tabel 4) nume:tabel6 >
#$ mod:blocare 3%DE
4$%WA#T6
unde mod:blocare poate avea valorile R%W SHARE, R%W E12.US#-E, SHARE, R%W SHARE
E12.US#-E sau E12.US#-E. Golosirea lui $%WA#T este opional "i are aceea"i semnificaie ca n
cazul de mai sus.
.n principal, blocarea manual a unui tabel folosind comanda .%25 TA7.E poate fi preferat n
urmtoarele situaii/
#ste necesar o vedere consistent asupra mai multor tabele. .n acest caz, tabelele pot fi
blocate n modul S, mpiedicnd operaiile &!+ asupra acestuia.
$e dore"te mpiedicarea altor utilizatori de a bloca tabelele asupra crora opereaz tranzacia
curent. Acest lucru se poate face blocnd tabelele n modul 1
$e dore"te ca o instruciune sa nu a"tepte pentru deblocarea unei resurse. .n acest caz se poate
folosi opiunea $%WA#T.
9rmtorul tabel rezum tipurile de blocare la nivel de rnd "i tabel obinute la e'ecutarea diverselor
comenzi $*+.
Comanda ()* %locare la ni"el
de r&nd
Mod de 'locare
*a ni"el de
ta'el
$#+#)> fr clauza GOA 93&A>#
@H$#A> B AB
93&A># B AB
&#+#># B AB
$#+#)> cu clauza GOA 93&A># B A$
+O)I >AB+# J n AOK $LAA# !O&# A$
+O)I >AB+# J n AOK #B)+9$@M# !O&# AB
+O)I >AB+# J n $LAA# !O&# $
+O)I >AB+# J n AOK $LAA# #B)+9$@M# !O&# A$B
+O)I >AB+# J n #B)+9$@M# !O&# B
7.$.2 Inter'locarea
&atorit accesului concurent la date este posibil ca mai muli utilizatori s se bloc,eze reciproc.
Aceast situaie se nume"te interblocare -deadloc65, pentru c fiecare dintre utilizatori a"teapt ca
cellalt s elibereze resursa blocat. .n cazul acesta problema nu se poate rezolva prin simpla
a"teptare, una din tranzacii trebuind s fie derulat napoi.
$ lum, de e'emplu, urmtoarele dou tranzacii care se e'ecut simultan/
>ranzacia A >ranzacia B
93&A># salariat
$#> salariu N C1==
KL#A# cod:salariat N 0=?4
93&A># departament
$#> localitate N O3loiestiP
KL#A# cod:dept N ?
93&A># departament
$#> nume:dept N O3roiectareP
KL#A# cod:dept N ?
AH& cod:tara N F=
93&A># salariat
$#> manaer N 0=0
KL#A# cod:salariat N 0=?4
0<Q
AH& cod:tara N F=
+a e'ecutarea primelor instruciuni din fiecare tranzacie nu este nici o problem. )nd ns
tranzaciile ncerc s obin blocri pentru instruciunile respective se va a(une la interblocare
deoarece tranzacia A trebuie s a"tepte ca tranzacia B s debloc,eze rndul din tabelul
departa+ent n timp ce tranzacia B trebuie s a"tepte ca tranzacia A s debloc,eze rndul din
tabelul *alariat. .n eneral o interblocare poate s fie cauzat de mai mult de dou tranzacii, de
e'emplu tranzacia ? a"teapt dup tranzacia 0, tranzacia C dup tranzacia ?, etc., iar tranzacia 0
a"tept dup tranzacia n.
Detectarea interblocrii
Oracle detecteaz interblocrile n mod automat. .n acest caz, Oracle semnaleaz o eroare uneia
dintre tranzaciile implicate "i deruleaz napoi ultima instruciune din acesta tranzacie. Acest lucru
rezolv interblocarea, de"i cealalt tranzacie poate nc s a"tepte pn la deblocarea resursei pentru
care a"teapt. &e obicei, tranzacia semnalat trebuie derulat napoi n mod e'plicit.
Evitarea interblocrii
@nterblocrile pot fi de obicei evitate dac tranzaciile care acceseaz acelea"i tabele bloc,eaz aceste
tabele n aceea"i ordine, prin blocare implicit sau e'plicit. &e e'emplu, putem impune reula ca,
atunci cnd este accesat att un tabel master ct "i un tabel detaliu, s fie blocat nti tabelul master "i
dup aceea cel de detaliu. &ac astfel de reuli sunt bine alctuite "i aplicate, atunci probabilitatea de
apariie a interblocrilor este foarte rar.
0<R

S-ar putea să vă placă și