Hızlı Konu Açma

Hızlı Konu Açmak için tıklayınız.

Son Mesajlar

Konulardaki Son Mesajlar

Reklam

Forumda Reklam Vermek İçin Bize Ulaşın

MS SQL ,TRY-CATCH yapısı ile Transaction hatası yakalamak

Mr.Onur

Fahri Üye
Fahri Üye
Fenerbahçe
Katılım
3 Şubat 2014
Mesajlar
1,744
Tepkime puanı
0
Puanları
0
Bazen , birden fazla işlem bir bütünün parçasıdır.Bu işlemlerden bir tanesi bile gerçekleşmezse , bütün işlemler başarısız kalabilir.

Bu yüzden bu tür işlemlerin tamamını , tek bir bütün olarak ele alınması gerekmektedir.İşte bu tarz , parçalanamayan(atomicity) işlemlerin oluşturduğu tek bir işleme transaction denir.

Özet bir ifadeyle transaction , daha küçük parçacıklara ayrılamayan işlem bloğu demektir.

Bir transaction bloğu , SQL Server tarafından şu şekilde ele alınır.


  • Transaction bloğu başlatılır.Bu işlem , SQL server tarafından otomatik olarak yada kullanıcı tarafından BEGIN TRANSACTION ile başlatılabilir.
  • Transaction bloğu arasında yapılan her işlemin başarılı olup olmadığına bakılır.Başarılı olmadığı anda geri alım işlemine(ROLLBACK) ,başarılı ise bir sonraki işleme geçilir.
  • Tüm işlemler tamamlandığında , COMMIT ile yeni hali sabitlenir.Başarısız bir sonuç olursa ROLLBACK ile en başa alınır ve bilgiler ilk hali ile sabitlenir.Her iki durumda , Transaction'ı bitirir.


Bir banka uygulamasını düşünelim.Bir kullanıcı başka bir kullanıcıya havale yaptığında ne olur.Öncelikle havale yapanın hesap bilgilerinden havale yaptığı miktar düşülür.Ardından alıcının hesabına bu miktar eklenir ve havale gerçekleşmiş olur.

Peki ya şöyle bir durum olursa , gönderenin hesabından para düşüldüğü anda ,elektirik kesilirse yada başka bir sebebten dolayı alıcının hesabına para eklenmezse ne olur ? Tabiki de çarşı karışır.Ortaya kime ait olduğu bilinmeyen bir para çıkar.

İşte bu gibi durumlarda transaction kullanılmalı ki , gönderici parayı gönderir fakat alıcı tarafında alma işlemi gerçekleşmezse , transaction sonlandığı anda , başarısız durumu olduğu için , göndericinin parasını hesabına geri eklesin.


Şimdi örneğimize uygun bir Harici Transaction kodlayalım.

Harici Transaction , programcı tarafından başlatılan ve sonlandırılan işlem bloğu için kullanılan bir terimdir.BEGIN TRAN ile başlatılıp , ROLLBACK TRAN veya COMMIT TRAN ile sonlandırılan bloktur

Önce bir "tblHesap" tablosu oluşturup içerisine iki adet veri ekleyelim.

Kod:
[CODE][B]CREATE TABLE tblHesap(
HesapNo CHAR(10) PRIMARY KEY NOT NULL,
isim VARCHAR(55),
soyad VARCHAR(55),
sube INTEGER,
bakiye MONEY
)

INSERT tblHesap
VALUES ('10000001','Eda','Şahin','511',3000)
INSERT tblHesap
[/B][/B][/FONT][/COLOR][/B][/B][/B][/B]
[/CODE]



şimdi ise yukdarda anlattığım örnekteki işlemi yapacak bir procedure tanımlayalım ve transaction ile destekleyelim.

Kod:
[B]CREATE PROC SP$havale (
@aliciHesap CHAR(10),
@gondericiHesap CHAR(10),
@miktar MONEY
)
AS
BEGIN TRY
 BEGIN TRANSACTION
 UPDATE tblHesap
 SET bakiye=bakiye-@miktar 
[/B][B][B] WHERE HesapNo=@gondericiHesap

[/B][/B]
Not: derlerken , önce tablo oluşturma ve ekleme kodlarını , sonra procedür' kodlarını derleyin.Çünkü "CREATE PROC" ifadesinin üzerinde bir komut olmamalı

 

Users Who Are Viewing This Konu (Users: 0, Guests: 1)

Üst