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
1 Cevap
[…] 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 […]