sintaksa e pergjithshme
BEGIN TRANSACTION <emertransaksion>
...........
...........
...........
COMMIT TRANSACTION <emertransaksion>
Versione te komandes e sakte
BEGIN TRAN <emertransaksion>
...........
...........
...........
COMMIT TRAN <emertransaksion>
--- e sakte
BEGIN TRAN
...........
...........
...........
COMMIT TRAN
--- e sakte
BEGIN TRANSACTION
...........
...........
...........
COMMIT TRANSACTION
Kontrolli i transaksionit
-- si e kontrollojme qe transaksioni eshte i sakte
-- perdorim
ROLLBACK TRANSACTION <emer>
ROLLBACK TRAN <emer>
ROLLBACK TRANSACTION
ROLLBACK TRAN
Si te gjejme ne ka gabim?
variabli @@ERROR
eshte i barabarte me 0 kur nuk ka patur gabim
eshte i ndryshem nga 0 kur ka ndodhur nje gabim
SHEMBULL
TE BEJME NJE TRANSAKSION QE BEN DALJE PRODUKTE
-- te bejme dalje produktet qe kane 3 njesi gjendje
-- te bejem dalje produktet qe kane 0 njesi gjendje
-- shembulli 1 pa transaksion
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=0
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=3
E para dha gabim , bie ndesh me kufizimin (UnitsInstock>0)
e dyta shkoi me sukses
-- shembull 2 me transaksion
BEGIN TRANSACTION Dalje
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=2
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=0
IF (@@ERROR<>0)
BEGIN
ROLLBACK TRANSACTION Dalje
print 'Transaksioni i daljes deshtoi'
END
ELSE
BEGIN
COMMIT TRANSACTION Dalje
print 'Transaksini shkoi me sukses'
END
-- i gjithe transaksioni eshte kthyer mbrapsht
-- shembull 3 me transaksion, gabimi ne fillim
BEGIN TRANSACTION Dalje
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=0
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=2
IF (@@ERROR<>0)
BEGIN
ROLLBACK TRANSACTION Dalje
print 'Transaksioni i daljes deshtoi'
END
ELSE
BEGIN
COMMIT TRANSACTION Dalje
print 'Transaksini shkoi me sukses'
END
-- transaksioni shkoi me sukses
--????????????????????????????
-- @@ERROR ruan statusin e gabimit te transaksionit
-- me te fundit
-- veprimi i fundit pa gabim zeron @@error
Kontroll me i mire i transaksionit
-- kontroll me mire behet
-- me TRY CATCH
--Sintaksa
BEGIN TRY
.... RRESHTA KODI
.... RRESHTA KODI
.... RRESHTA KODI
.... RRESHTA KODI
.... RRESHTA KODI
END TRY
BEGIN CATCH
.... RESHTA KODI QE EKEZEKUTOHEN
....VETEM NESE KA GABIM
END CATCH
-- KONTROLLI I TRANSAKSIONIT
-- E VENDOSIM TRANSAKIONIN BRENDA BLLOKUR TRY
-- VENDOSIM KODIN QE TRAJTON
--GABIMET TEK BLLOKU CATCH
BEGIN TRY
BEGIN TRANSACTION Dalje
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=0
update Products
set
UnitsInStock=UnitsInStock-1
where UnitsInStock=1
COMMIT TRANSACTION Dalje
PRINT 'Transaksioni shkoi me sukses'
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION Dalje
print 'Transaksioni deshtoi me sukses'
END CATCH
USHTRIME
Ushtrim 1
Ndertoni nje transaksion i cili :
1) te gjithe punonjesit qe kane realizuar me pak se 50 porosi i ben me Title='Pushuar nga puna'
2) Fshin te gjithe porosite qe ata kane realizuar
Zgjidhje
BEGIN TRY
BEGIN TRAN
UPDATE Employees
SET Title='Pushuar nga puna'
where
EmployeeID IN
(
select EmployeeID
from Orders
group by EmployeeID
having COUNT(*)<50
)
DELETE Orders
WHERE EmployeeID IN
(
select EmployeeID
from Orders
group by EmployeeID
having COUNT(*)<50
)
COMMIT TRAN
print 'transaksioni shkoi me sukses'
END TRY
BEGIN CATCH
ROLLBACK TRAN
Print 'transaksioni deshtoi'
END CATCH
Pyetje?
Kur mund te shkoje me sukses ky transaksion?
Pothuajse asnjehere, Vetem nese porosite nuk permbajne Order details.
Ushtrim 2 Ndertoni nje transaksion qe shton nje porosi per produktin me kodin 5, per klientin me kodin ALFKI dhe punonjesin me kodin 1.
Sasia e porositur do te jete 10 ndersa cmimi i barabarte me cmimin e produktit
Nese nuk ka gjendje transaksioni duhet te kthehet mbrapsht
BEGIN TRY
BEGIN TRANSACTION POROSI5
DECLARE @oid INT
DECLARE @PRICE MONEY
INSERT INTO ORDERS(CustomerId,OrderId) values ('ALFKI',1)
SELECT @oid=@@IDENTITY
SELECT @PRICE=UNITPRICE FROM Products WHERE ProductID=5
INSERT INTO [ORDER DETAILS](OrderId,ProductId,UnitPrice,Quantity)
VALUES (@OID,5,@PRICE,10)
UPDATE PRODUCTS SET UNITSINSTOCK=UNITSINSTOCK-10
COMMIT TRANSACTION POROSI5
PRINT 'TRANSAKSIONI PERFUNDOI ME SUKSES'
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION POROSI5
PRINT 'POROSIA DESHTOI'
END CATCH