Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Transact Sql-Transaction

Bu yazımızda T-SQL de transactionlardan bahsedeceğim.
Birden çok işlemin bir arada yapıldığı durumlarda eğer parçayı oluşturan işlemlerden herhangi birinde sorun olursa tüm işlemi iptal ettirmeye yarar.
Örneğin kredi kartı ile alışveriş olayında transaction olayı vardır.Siz marketten ürün alırken sizin hesabınızdan para düşülecek,marketin hesabına para aktarılacak.Bu işlemde hata olmaması gerekir ve bundan dolayı bu işlem bir transaction bloğunda gerçekleştirilmelidir.Yani kodlarımız sırasıyla işleyecek(Sizin kredi kartından paranın düşülmesi,diğerinin hesabına aktarılması).Bu esnada sorun olursa bütün işlemler iptal edilecek.Olmazsa bütün işlemler gerçekleşecektir.
Begin tran veya begin transaction : Transaction işlemini başlatır.
Commit tran : Transaction işlemini başarıyla sona erdirir.(İşlemi gerçekleştirir.)
Rollback tran : Transaction işlemini iptal eder.(İşlemi geri alır.)
Normalda default olarak herşey begin tran ile başlayıp, commit tran ile biter.Biz yazmasak bile.
Commit tran yerine sadece commit,rollback tran yerine de sadece rollback yazılabilir.


begin tran
declare @i int
delete from PersonellerYedek where PersonelID>36
set @i=@@ROWCOUNT
if @i=1
begin
print 'Kayıt silindi.'
commit -- ya da commit tran
end
else
begin
print 'İşlemler geri alındı.'
rollback -- ya da rollback tran
end

Yukarıda gördüğünüz gibi delete işlemi sonucunda kaç kayıt etkilenmiş onu @i değişkenine alıyoruz.Ve transaction sayesinde şu kontrolü yapabiliyorum.Eğer i 1 ise sil,değilse işlemleri geri al.
NOT:Transaction a isim verebiliriz.Zorunluluk yoktur.
Soru’’
2 adet banka tablosu yaparak, birinci bankada bulunan hesaba, 2. bankadan havale yaptıralım.
Öncelikle banka tablolarını oluşturalım.


create table Ziraat
(
ZHesapNo int,
ZPara money
)
create table Garanti
(
GHesapNo int,
GPara money
)

Ziraat bankasına hesap no su 10 ve 20 olan iki kayıt ekledim ve sırasıyla 1000 ve 2000 para kayıt ettim.
Garanti bankasına hesap no su 30 ve 40 olan iki kayıt ekledim ve sorasıyla 3000 ve 4000 para kayıt ettim.
Bankalar arası havale işlemini gerçekleştirecek stored proc. yazalım.


create proc HavaleYap
(
@BirinciHesapNo int,
@ÝkinciHesapNo int,
@GonderilecekPara money
)
as
begin tran Kontrol
declare @HesaptakiPara money
select @HesaptakiPara = ZPara from Ziraat where ZHesapNo=@BirinciHesapNo
if @HesaptakiPara<@GonderilecekPara
begin
rollback tran Kontrol
print 'Hesapta Yeterli Para Yok'
end
else
begin
update Ziraat set ZPara=ZPara-@GonderilecekPara where ZHesapNo=@BirinciHesapNo
update Garanti set GPara=GPara+@GonderilecekPara where GHesapNo=@ÝkinciHesapNo
end
---
if not exists(select * from Ziraat where ZHesapNo=@BirinciHesapNo)
begin
rollback tran Kontrol
print 'Böyle bir hesap numarası bulunamadı.'
end
else if not exists(select * from Garanti where GHesapNo=@ÝkinciHesapNo)
begin
rollback tran Kontrol
print 'Böyle bir hesap numarası bulunamadı.'
end
else
begin
commit tran Kontrol
print 'Transfer işlemi başarıyla gerçekleşti.'
End

Yukarıdaki yapıyı inceleyiniz.
Şu yapılarıda incelemekte fayda var.Zamanla bunlar hakkında yazılar hazırlayacağım.
ISOLATION LEVELS
DEAD LOCKS

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 09 Ağustos 2021

    […] Yine de transaction’a dair herhangi bir fikri olmayanlar tee zamanında yazdığım Transact Sql-Transaction başlıklı makalemi okuyabilirler. Aradan yıllar geçmesine rağmen transaction’a dair pek […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir