Documente Academic
Documente Profesional
Documente Cultură
Obiective
La sfarsitul acestui capitol, veti putea sa:
1. Definiti o tranzactie
2. Folositi declaratii , formulari, instructiuni de genul BEGIN TRAN(inceperii unei
activitati), COMMIT WORK(realizarii unei activitati) si ROLLBACK (revenirii
asupra unei acitvitati,reluarea ei) in cadrul unei tranzactii
Ce este o tranzactie?
Gestiunea tranzactiilor, se refera la capacitatea unui SGBD relational de a efectua
tranzactii intr-o baza de date.
O tranzactie este o multime de instructiuni care se executa in grup. Daca oricare din
instructiune nu poate fi incheiata, toate celelalte actiuni trebuiesc refacute. Tranzactiile
sunt unitati de prelucrare(program) care trebuie efectuate fie in intregime, fie deloc. Prin
unitate de prelucrare intelegem ca o tranzactie are un inceput si un sfarsit.
Prin urmare o tranzactie are intotdeauna un inceput si un sfarsit. Server-ul bazei de date
garanteaza ca operatiile realizate in limitele unei tranzactii vor fi fie complet si perfect
salvate pe disc, sau daca acest lucru nu este posibil, baza de date va reveni in stadiul in
care era inainte ca tranzactia sa fi inceput.
Daca ceva gresit se petrece intimpul unei tranzactii, intreaga unitate de prelucrare
poate fi anulata, dupa dorinta utilizatorului. Daca totul este corect, unitatea de prelucrare
poate fi salvata in intregime in baza de date
O tranzactie bancara
Transferul banilor din contul de economii in contul curent este un bun exmplu de
tranzactie.
Actiuniile implicate in aceasta tranzactie sunt:
Actualizarea contului de economii prin indicarea unei retrageri.
Actualizarea contului curent pentru a pune in evidenta un depozit.
Aceste actiuni trebuiesc amandoua incheiate cu succes inainte ca transferul sa fie
terminat. Daca ceva nu merge,cu oricare dintre cele doua actiuni, tranzactia esueaza. De
exmplu daca ati incercat sa transferati, in contul curent, mai multi bani decat aveti in
contul de economii transferul nu va avea loc si balanta conturilor dumneavoastra va
ramane la fel cum a fost inainte ca dumneavoastra sa incercati sa realizati transferul.
1. BEGIN TRANSACTION
2. INSERT INTO clienti (customer_nu,fname,lname)
VALUES(0,Fred,Flinstone);
3. SELECT * FROM clienti WHERE fname=Fred
4. ROLLBACK WORK
5. SELECT * FROM clienti WHERE fname=Fred
Primul SELECT returneaza doi clienti inclusiv noul client inserat. Al doilea SELECT
returneaza doar un singur client deoarece instructiunea INSERT a fost reluata.
TRANZACTII (SQL-SERVER)
.
@variabila-punct-de salvare
Este numele unei variabile definite de utilizator ce contine numele punct de salvare valid.
Variabile trebuie sa fie declarata de tipul char, varchar, nchar, sau nvarchar.
Dupa inceperea unei tranzactii, este efectuata de obicei o procedura de verificare a erorilor
pentru a determina daca tranzactia a fost executata cu succes pana in momentul respectiv.
Instructiunea ROLLBACK readuce tranzactia la forma initiala. Aceasta inseamna ca starea bazei
de date este refacuta in forma care exista inaite de inceperea tranzactiei.
Folosirea punctelor de salvare in tranzactii
SAVE TRAN [ SACTION ] { nume-punct-de salvare | @variabila-punct-de salvare }
Am mentionat ca operatia de readucere a unei tranzactii la punctul de inceput inseamna de fapt
anularea intregii tranzactii. Cu toate acestea, in unele cazuri, ati dori sa executati doar o parte din
tranzactie adica o parte din instructiunile din cadrul tranzactiei. Pentru a realiza acest lucru,
trebuie sa folositi un punct de salvare. Dincolo de acest punct, daca apare o comanda de
revenire, tranzactia este adusa la starea din punctul de salvare. Toate instructiunile care au fost
executate pana in acest punct de salvare sunt salvate.
----------------BEGIN TRANSACTION
INSERT INTO catalog VALUES('222','3',8,'17-06-2005')
COMMIT TRANSACTION
GO
SELECT * FROM Catalog
----------------BEGIN TRANSACTION tran1
INSERT INTO catalog VALUES('222','3',10,'17-06-2005')
COMMIT TRANSACTION tran1
GO
SELECT * FROM Catalog
----------------DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'TransactiaMea'
BEGIN TRANSACTION @TranName
GO
USE dbStud
GO
UPDATE catalog
SET Nota = Nota +1
WHERE NrLeg LIKE '22%'
GO
COMMIT TRANSACTION TransactiaMea
GO
SELECT * FROM Catalog
CAPITOLUL 10
CONTROLUL CONCURENTEI
Obiective
La sfarsitul acestui capitol, veti putea sa:
1. Descrieti tipurile de control al concurentelor in bazele de date Informix
2. Descrieti cele patru niveluri de izolare, separare pentru citirea datelor in bazele de
date IDS
3. Descrieti cele patru trepte de blocare(sau inchidere, fixare) a granularitatii
Tipuri de concurente
Controlul concurentelor influenteaza modul in care datele pot fi vizualizate si actualizate
de catre utilizatori accesand aceeasi informatie la un moment dat. De exmplu, doriti ca un
utilizator sa vizualizeze o comanda ce este modificata de catre un alt utilizator? Doriti ca
un utilizator sa modifice o comanda care este vizualizata de catre un alt utilizator ?
Exista doua tipuri de control al concurentelor:
Primul tip de concurenta este cel care se aplica bazelor de date cu accesul readonly si este SELECT. Acesta este referit ca un nivel de izolare(separare). Exista 4
niveluri de izolare(separare).
Cel de-al doilea tip de concurenta este cel care se aplica inregistrarilor actualizate
ale bazelor de date si avem: INSERT, DELETE si UPDATE.
Sigurante(sau lacate sau inchizatori)
Informix impune, constrange controlul concurentelor folosind sigurante(sau lacate sau
inchizatori). Exista 3 tipuri de sigurante care pot fi folosite:
Exclusive lock: nici o alta siguranta nu poate fi fixata unei date ce contine o
siguranta exclusiva (exclusive lock).
Shared lock: sunt palsate de procesele de citire a datelor . O siguranta shared nu
poate fi pusa unei date ce are deja o siguranta exclusiva. Unei date i se poate atasa
una sau mai multe sigurante shared.
Update lock: este asemanatoare cu o siguranta shared exceptand faptul ca nu
poate fi avansata, mai tarziu, ca siguranta exclusiva .
Citirea concurentelor: cele 4 niveluri de izolare( separare)
10
SET ISOLATION
Read Uncommited
Read Commited
Not Supported
(ANSI)Repeatable Read
Serializable
Dirty Read
Commited Read
Cursor Stability
(Informix)Repeatable Read
(Informix)Repeatable Read
11
ANSI
READ UNCOMMITED
( Nerealizarea citirilor)
Descriere
Nivelul default de izolare al
unei baze de date fara a fi
inregistrata.
COMMITED READ
READ COMMITED
Nivelul default de izolare al
(Citire Realizata)
(Realizarea Citirilor)
unei
baze
de
date
inregistrata fara a fi insa in
conformitate cu ANSI.
REPEATABLE READ
SERIALIZABLE
Nivelul default de izolare al
(Citire repetabila)
(Transmitere in serie)
unei baze de date in
conformitate cu ANSI.
Nivelul default de izolare pentru o baza de date particulara este stabilit in momentul in
care baza de date este creata. Nivelul default de izolare pentru fiecare tip de baza de date
este descris in tabelul de mai sus.
Gradul de tolerabilitate a inferentelor
Nivelul de izolare(separare)
DIRTY READ (Citire Dirty) sau READ
UNCOMMITED( Nerealizarea Citirilor)
COMMITED READ (Citire Realizata) sau
READ COMMITED(Realizarea Citirilor)
CURSOR
STABILITY(Stabilitatea
Cursorului)
(ANSI)Repeatable Reads(Citiri Repetabile)
sau Serializable (Transmitere in serie)
Descriere
Permite procesului sa vizualizeze datele
dirty.
Nu permite procesului sa vizualizeze datele
dirty.
Nu le este permis altor procese sa-mi
modifice linia curenta.
Nu le este permis altor procese sa-mi
modifice nici una din liniile blocate pana
cand nu am incheiat .
13
Doar o singura siguranta poate fi aplicata unei baze de date la un anumit timp asta in
conditiile in care utilizatorul blocheaza(inchide) un tabel, nici un alt utilizator nu mai
poate bloca tabelul pana in momentul in care primul utilizator il deblocheaza.
Tabelele catalog-system nu pot fi blocate(inchise).
Daca baza de date contine tranzactii tabelele pot fi blocate doar in interiorul tranzactiilor.
De aceea fiti siguri ca ati executat BEGIN WORK( cu exceptia folosirii bazei de date in
modul ANSI) inainte de a incerca sa blocati un tabel. Tabelul va fi deblocat cand
tranzactia este incheiata.
Blocarea(sau inchidere sau fixare) unui tabel in SHARE MODE
Daca doriti sa acordati celorlalti utilizatori acces la citirea tabelului dar sa preveniti
modificarea oricarei date continute de acesta atunci ar trebui sa folositi instructiunea
LOCK TABLE cu optiunea IN SHARE MODE.
Cand un tabel este blocat in SHARE MODE alti utilizatori pot selecta date din tabel dar
nu pot(nu le este permis) sa insereze, stearga sau actualizeze(INSERT, DELETE,
UPDATE) linii dintr-un tabel sau sa modifice(ALTER) un tabel.
Ar trebui retinut ca blocarea unui tabel in SHARE MODE nu previne sigurantele liniilor
de a fi amplasate(pozitionate) astfel incat permit actualizarea de catre procesul dvs. .
Daca doriti sa evitati sigurantele exclusive ale liniilor in completarea sigurantelor share
ale unui tabel, trebuie sa blocati(inchideti) tabelul in modul exclusiv(EXCLUSIVE
MODE).
Blocarea unui tabel in modul exclusiv(EXCLUSIVE MODE)
Dca doriti sa impiedicati accesul utilizatorilor la tabel atunci ar trebui sa-l blocati cu
modul exclusiv( EXCLUSIVE MODE).
In modul exclusiv(EXCLUSIVE MODE) alti utilizatori nu vor putea sa selectze(doar
daca este folosita izolarea dirty read), insereze, stearga sau actualizeze(SELECT,
INSERT,DELETE , UPDATE) linii in tabel pana in momentul in care nu deblocati
tabelul.
Doar o siguranta este folosita pentru a bloca tabelul, in ceea ce priveste numarul de linii
care sunt actualizate in interiorul unei tranzctii.
Tabele ce contin BLOBs intr-un blobspace
Daca un tabel este blocat cu modul exclusiv (EXCLUSIVE MODE) si sunt facute
modificari valorilor BLOB asociate, fiecare BLOB accesat obtine siguranta exclusiva
proprie. Aceste sigurante sunt amplasate si eliberate automat. Pentru un blobpage sunt
folosite doua sigurante. Tabelele ce contin BLOB-uri localizate in tabel nu obtin sigurante
aditionale.
Deblocarea unui tabel
14
Cand creeati un tabel alegeti modul de blocare folosit in momentul accesarii oricarei linii
din tabel. Nivelul de blocare de pagina cauzeaza blocarea intregii pagini de date oricand
o singura linie localizata in acea pagina trebuie sa fie blocata. Nivelul de blocare de linie
cauzeaza doar blocarea liniei respective.Modul default de blocare atunci cand se creeaza
un tabel este page level (nivelul pagina).
Sigurantele paginii sunt folositoare atunci cand, intr-o tranzactie, procesul trece in aceeasi
ordine ca si multimea indexata a tabelului sau procesul trece intr-o ordine fizica
secventiala.
Sigurantele liniei sunt folositoare atunci cand, intr-o tranzactie, procesul trece intr-o
ordine arbitrara.
15
Cand numarul liniilor blocate este mare putem intalni urmatoarele riscuri:
Numarul permis de sigurante este epuizat
Superioritatea management-ului sigurantelor devine significanta
Exista un trade-off intre aceste doua niveluri de blocare. Page level (nivelul pagina) are
nevoie de mai putine resurse decat blocarea la nivel de rand (row level) dar de asemenea
reduce concurenta. Daca o pagina blocata este amplasata intr-o pagina ce contine multe
linii, altor procese ce necesita alte date din aceeasi pagina li se poate nega accesul la acele
date.
Accesul la sigurante:nivelul linie/pagina
A(contine sigurantele)
B(solicitat)
x=exclusiv
u=actualizare
s=shared
X
U
S
X
n
n
n
U
n
n
y
S
n
y
y
vid
y
y
y
Harta de mai sus pune in evidenta interactiunea dintre sigurantele detinute si cele
solicitate de doua procese diferite in cadrul aceleiasi resurse a nivelului linie/pagina.
Pe axa orizontala se afla sigurantele care ar putea fi detinute de procesul A. Pe axa
verticala se afla sigurantele solicitate de procesul B. Matricea arata rezultatul sigurantei
solicitate(y=siguranta admisa, n=siguranta refuzata).
Detectarea impasurilor(DEADLOCK)
16
Procesul A
Detine o siguranta pe linia x
Doreste o siguranta pe linia y
A
Procesul B
Doreste o siguranta pe linia x
Detine o siguranta pe linia y
B
Cand mai multe procese acceseaza aceleasi linii dintr-un tabel exista posibilitatea
aparitiei unui impas.
In exemplul de mai sus procesul A detine o siguranta pe linia x. Procesul A vrea sa obtina
o siguranta pe o a doua linie, linia y. Linia y este blocata curent de un alt utilizator
procesul B. Daca procesul A asteapta sigurante(folosind modul SET LOCK TO WAIT)
atunci va astepta ca procesul B sa elibereze siguranta de pe linia y. Procesul B intre timp
detine siguranta pe linia y si vrea sa obtina o siguranta pe linia x. Linia y este blocata de
un alt utilizator si daca procesul B asteapta sigurante va astepta linia x sa fie libera.
Altfel spus A asteapta B si B asteapta A. aceasta este o situatie de impas amandoua
procesele asteptand la nesfarsit. Aceasta situatie poate sa apara de asemenea in cazul unui
numar mai mare de utilizatori.
Detectarea impasurilor
Impasurile reprezinta probeleme serioase deoarece ele pot opri cea mai mare parte a
activitatii intr-un sistem al bazei de date. Informix are un mecanism incorporat care
detecteaza aceste impasuri si preintampina aparitia lor.
Server-ul bazei de date pastreaza pe sistem o lista de sigurante pentru fiecare utilizator.
Inainte ca o siguranta sa fie admisa este verificata lista de sigurante pentru fiecare
utilizator este examinata. Daca o siguranta este retinuta de o resursa pe care procesul
doreste sa o blocheze, posesorul acelei sigurante este identificat si lista de sigurante este
traversata penru a se observa daca se gasesc asteptari ale oricaror sigurante retinute de
utilizatorul care doreste noua siguranta. Daca exista, impasul este detectat la acest pas si
utilizatorului care doreste siguranta ii este transmis un mesaj de eroare.
17
Codul de eroare ISAM trnsmis este: -143 ISAM error: deadlock detected.
18