You are on page 1of 8

SEMINAR 6

Në këtë seminar do të ilustrojmë tre tipet e transaksioneve dhe mënyrën sesi reagon DBMS për secilin prejt
tyre.
Për këtë si fillim do të krijojmë një bazë të dhënash “TestDB”, duke përdorur konfigurimet default të SSMS
(SQL Server Management Studio).

Pas krijimi të bazës së të dhënave, zgjedhim që veprimet e mëposhtme do të realizohen në TestDB

Ashtu siç kemi përmendur dhe në leksion, sesionet SQL Server operojnë në AUTOCOMMIT mode.
Në ushtrimet që do të realizojmë mëposhtë, do të shohim sesi reagon sistemi kur realizojmë veprime në
AUTOCOMMIT mode dhe gjithashtu kur ekzekutojmë transaksione eksplicite dhe implicite.
Komanda BEGIN TRANSACTION; i tregon sesionit se instruksionet pasardhëse do të ekzekutohen s transaksione
eksplicit, deri sa të haset instruksioni ROLLBACK ose COMMIT. Pas ekzekutimit të këtyre dy
instruksioneve, sesioni ri-kthehet automatikisht në autocommit mode.
Komanda SET IMPLICIT_TRANSACTIONS ON; Konfiguron sesionin SQL Server që të përdor transaksionet
implicite, dhe do të qëndrojë në këtë gjendje derisa të mbyllet sessioni ose të kalojmë manualisht në
Autocommit, duke ekzekutuar instruksionin SET IMPLICIT_TRANSACTIONS OFF;.
Le të shohim në fillim në shembull të thjeshtë:

SHEMBULL 1
Shkruajme dhe ekzekutojmë hapat e mëposhtme:
1. Krijojmë tabelën T me tre kolona: ID Celes primar te tipit int, S te tipit varchar(30) dhe si të tipit
smallint.
2. Një rresht te ri duke përdorur instruksionin INSERT INTO.
3. Kontrollojmë nqs rreshti i ri u shtua me sukses, nëpërmjet instruksionit SELECT
4. Ekzekutojmë instruksionin ROLLBACK
Cilat janë mesazhet që marrim gjatë ekzekutimit të hapave të mësipërm një pas tjetrit.
1. Kur ekzekutojmë instruksionin CREATE TABLE, mesazhi që marim është:

2. Kur ekzekutojmë instruksionin INSERT INTO, mesazhi që marim është:

3. Kur ekzekutojmë instruksionin SELECT, mesazhi që marim është i njëjtë si mësipër (1 row affected)
dhe shfaqet tab-i result me të dhënat e tabelës:

4. Kur ekzekutojmë instruksionin Rollback, mesazhi që marim është:

Nqs sesioni është në autocommit mode, instruksionet Rollback dhe Commit nuk ekzekutohen, duke shfaqur
mesazh gabimi; siç është dhënë dhe më lart kur kemi përdorur instruksionin Rollback. Kur ri-ekzekutojmë
instruksionin select do të marrim po të njëjtat përgjigje që morën në hapin e tretë.

SHEMBULL 2
Shkruajme dhe ekzekutojmë hapat e mëposhtme:
1. Shkruajmë instruksionin Begin Transaction, për të kaluar sesionin në eksplicit transaction.
2. Një rresht te ri duke përdorur instruksionin INSERT INTO.
3. Kontrollojmë nqs rreshti i ri u shtua me sukses, nëpërmjet instruksionit SELECT
4. Ekzekutojmë instruksionin ROLLBACK
5. Rikontrollojmë nqs rreshti gjendet në tabelë.

1. Kur ekzekutojmë instruksionin BEGIN TRANSACTION, i tregon sesionit se të gjitha instruksionet e


mëposhtme do të trajtohen si instruksione eksplicite, derisa të haset ose Rollback ose Commit.
2. Kur ekzekutojmë instruksionin INSERT INTO, mesazhi që marim është:
3. Kur ekzekutojmë instruksionin SELECT, mesazhi që marim është (2 rows affected) dhe shfaqet tab-i
result me të dhënat e tabelës:

4. Kur ekzekutojmë instruksionin Rollback, mesazhi që marim tregon se komanda u ekzekutua me sukses,
pra rreshti i shtuar në pikën dy do të fshihet nga tabela T:

5. Kur ri-ekzekutojmë instruksionin SELECT, mesazhi që marim është (1 row affected) dhe shfaqet tab-i
result me të dhënat e tabelës:

Kujdes! Në këtë detyrë ekzekutimi i instruksionit Rollback, u realizua me sukses pasi në fillim të të gjithë
instruksioneve, ekzekutuam komandën BEGIN TRANSACTION. Pas përfundimit me sukses të hapit të 4,
sesi ka kaluar automatikisht në autocommit mode.

SHEMBULL 3
Shkruajme dhe ekzekutojmë hapat e mëposhtme:

Rezultati dhe mesazhi që marrim nga ekzekutimi i këtyre transaksioneve është:


Rezultati Mesazhi
Nqs ekzekutojmë instruksionet e mëposhtme:

Mesazhi që marrim është:


Rezultati Mesazhi

Nga mesazhi i marrë shohim që tabela T nuk ka rreshtin e dytë të insertuar, ndërsa tabela T2 nuk ekziston.
Përsa ka ndodhur kjo?
Nqs i referohemi 8 instruksioneve të para dhe i shohim me vëmendje:
 SET IMPLICIT_TRANSACTIONS ON; - Kalon sesionin e DBMS në Implicit Transaction.
 Veprimet e tjera, realizojnë ndryshime në bazën e të dhënave, ku kemi shtimin e një rreshti të ri në
tabelën T, Krijimin e një tabele të re T2 dhe shtimin e një rreshti të ri në tabelën T2:

 INSERT INTO T (id, s) VALUES (2, 'will this be committed?');


 CREATE TABLE T2 (id INT); -- Testimi i nje veprimi DDL
 INSERT INTO T2 (id) VALUES (1);
 SELECT * FROM T2; - Kontrollojmë nqs tabela është krijuar me sukses dhe a është shtuar rreshti në
tabelë.
 ROLLBACK; -Kthejme mbrapsht të gjitha veprimet që janë realizuar që pas vendosjes së sesionin në
Implicit transaction.

Ashtu, sic e kemi përmendur dhe në leksion, Transaksionet Implicite janë transaksione kur lejohen
ekzekutimi i instruksioneve DML dhe DDL, dhe ato nuk realizohen në bazën e të dhënave deri të ekzekutohet
instruksioni COMMIT. Në rast se ekzekutohet instruksioni ROLLBACK, të gjitha veprimet e realizuara që
nga vendosja e sessionit në Implicit Transaksioni, apo që nga ekzekutimi i fundit COMMIT, do të kthehen
mbrapsht.
Pra, edhe në shembullin tonë të tre veprimet ( Insert into, create table dhe insert into) do të kthehen mbrapsht.
Kjo do të thotë që tabela T nuk do të përmbajë rreshtin e ri të shtuar, ndërsa tabela T2 nuk do të ekzistojë në
Bazën e të dhënave. Kjo është dhe arsyeja e mesazhit të fundit të marrë.

SHEMBULL 6
Shkruajme dhe ekzekutojmë hapat e mëposhtme. Instruksioni në reshtin 1, SET NOCOUNT ON, është një
instruksion i cili ndalon shfaqen e
mesazhit ‘n row(s) affected’. Në
rreshtin 3 i tregojmë editor-it që
instruksionet e mëposhtmë janë
transaksione Implicite. Në rreshtat 5-
9, kemi krijuar tabelën Accounts, me
dy kolona: acctID-Primary key dhe
balance – e cila duhet të përmbajë
gjithëmonë vlera > 0. Në rreshtin 10
kemi bërë commit krijimin e tabelës,
Në rreshtat 12-14, kemi shtuar dy
rreshta në tabelën accounts dhe i kemi
aprovuar ato. Në rreshtin e fundit, 12,
kemi marrë informacion nga tabela e
krijuar.
Në dy figurat e mëposhtmë, tregohen tab-i result dhe tab-i Messages, ku tek kjo e fundit do të vini re se
mungon mesazhi ‘2 rows affected’.

Realizojmë një kontroll nqs kufizimi check për kolonën balance funksion në rregull. Për këte tentojmë të
ndryshojmë balancën e llogarisë më kod 202, duke e ulur balancën me 2000. Mesazhi që marrim nga
ekzekutimi i këtij instruksioni është:

Msg 547, Level 16, State 0, Line 18


The UPDATE statement conflicted with the CHECK constraint "unloanable_account".
The conflict occurred in database "TestDB", table "dbo.Accounts", column 'balance'.
Por çfarë ndodh nqs tentojmë të ndryshojmë balancën e një llogarie, kodi i të cilës nuk ekziston në tabelën
Accounts? Duke qënë se në rreshtin e parë të instruksioneve, kemi vendosur që të mos shfaqet mesazhi i
numri të rreshtave të afektuar, mesazhi që marrim nga transaksioni është Commands completed successfully.
Por nqs bëjmë një select nga tabela account do të vëmë re se kjo llogari nuk ekziston.

Këto dy probleme mund të kontrollohen nëpërmjet instruksoneve if dhe dy variablave të sistemit @@error
dhe @@rowcount. Nqs @@error<> 0 do të thotë që kemi një gabim në ekzekutim, ndërsa nëse
@@rowcount = 0, do të thotë që ndryshimi nuk është realizuar për asnjë nga rreshtat e tabelës, dhe atëherë
kthejmë mbrapsht të gjithë transaksionin nëpërmjet komandës ROLLBACK; në rast të kundërt ekzekutojmë
COMMIT.

SHEMBULLI 7
Çfarë ndodh në qoftës jemi duke ekzekutuar disa transaksione implicite/eksplicite dhe gabimisht tentojmë të
mbyllim SSMS pa ekzekutar ndonjërin nga instruksionet ROLLBACK apo COMMIT? Për ti dhënë përgjigje
kësaj pyetje shkruajmë hapat e mëposhtëm dhe i ekzekutojmë.
Më pas mbyllim SSMS, dhe mesazhi që marrim është si mëposhtë, i cili tregon se kemi transaksione të
papërfunduara dhe çfarë kërkojmë të realizojmë me to: ti bëjmë commit ( duke klikuar butonin OK), ti
kthejmë mbrapsht (duke klikuar butonin NO) apo cancel pasi duam ende të vazhdojmë të ndryshojmë
transaksionet.

 Në rast se zgjidhni ‘OK’ të dhënat do të ruhen dhe SSMS-ja do mbyllet. Në momentin tjetër që
rihapim SSMS të dhënat e shtuara do të jenë në tabelë.

 Në rast se zgjidhni ‘NO’ të dhënat nuk do të ruhen dhe SSMS-ja do mbyllet. Në momentin tjetër që
rihapim SSMS të dhënat nuk do të jenë në tabelë.

You might also like