Transaction için SQL Server ortamında kullandığımız iş birimidir diyebiliriz. Çoğu zaman bir transaction yalnızca bir türde işlem yapar, yani sadece veri silme, veri güncelleme veya veri ekleme gibi tek türde işlem yapar. Ama bir transaction içinde birden fazla da işlem yapılabilir. Yine transaction içinde SELECT işlemleri de yapılabilmektedir. Transaction, çalışma yapısı olarak ya bütün işlemleri gerçekleştirir ya da
hiçbirini gerçekleştirmez. İşlemlerden biri başarısız olursa, hiçbir işlem gerçekleşmez; ancak tüm işlemler
başarılı olduğunda Transaction, içinde gerçekleşen tüm veri
değişikliklerini onaylamış demektir.
Transaction bloğundaki işlemlerin hepsi başarılı olduğunda Transaction Commit (Onaylama) komutu çalışır ve değişiklikler veritabanında gerçekleşmiş olur. ancak bir hata varsa işleyiş bozulur ve Transaction Rollback (Geridönüş) komutu çalışır, bu şekilde tüm işlemler geri alınır ve en başa dönülür. Böylece veri kaybına karşı bir çeşit koruma mekanizması oluşturulmuş olunur.
Transaction Nerde ve Ne Zaman Kullanırız
Örneğin veri tabanımızdan silinen kayıtları, başka bir veri tabanına yedekliyorsak. Bir silinme ve bir kaydetme işlemi söz konusu. Bu işlemlerin sırayla gerçekleşmesi gerekiyor. Silinme işlemi başarılı bir şekilde tamamlandı. Fakat kaydetme işleminde bir hata meydana geldi. Bu hata yetersiz hafızadan kaynaklanabilir, sistem işlem sırasında yeniden başlatılmıştır veya fiziksel bir arıza nedeniyle kapanmıştır. Bu nedenler yüzünden silinmiş kaydımıza elveda demek yerine, böylesi sorunlarla karşılaşma ihtimalimize karşı önlemimizi almamız gerekir. Çalışmasını istediğimiz kod bloğunu "transaction" bloklarına alırız ve sorun çözülmüş olur.
Şimdi örnekle konuyu pekiştirelim.
Örnek: Bir banka sisteminde para havale etme işlemi için örnek bir transaction tasarlayalım. Öncelikle aşağıdaki gibi bir "HESAP" tablosu oluşturalım ve tablomuzda müşterilere ait HESAP_ID, AD, SOYAD, HESAP_NO, BAKIYE bilgilerini tutalım.
CREATE DATABASE BANKA USE BANKA CREATE TABLE HESAP ( HESAP_ID INT PRIMARY KEY IDENTITY (1,1) NOT NULL, AD VARCHAR(30) NOT NULL, SOYAD VARCHAR(30) NOT NULL, HESAP_NO INT NOT NULL, BAKIYE INT NOT NULL )
Oluşturmuş olduğumuz "HESAP" tablomuza örnek kayıtlar girelim.
INSERT INTO HESAP VALUES('İBRAHİM','BAYRAKTAR',19265,7000) INSERT INTO HESAP VALUES('SAMET','ULUTURK',19572,10000) INSERT INTO HESAP VALUES('RAMAZAN','PINARBAŞI',19752,9500) INSERT INTO HESAP VALUES('RAŞİT','BAKIR',19912,17000)
"Samet ULUTURK'ün hesabından, İbrahim BAYRAKTAR'ın hesabına 1000 TL havale yapılsın." Bu işlem için izleyeceğimiz algoritma Samet ULUTURK'ün bakiye bilgisini 1000 azaltmak ve İbrahim BAYRAKTAR'ın bakiye bilgisini 1000 artırmak olacaktır.
UPDATE HESAP SET BAKIYE = BAKIYE - 1000 --1.Sorgu WHERE AD='SAMET' AND SOYAD='ULUTURK' UPDATE HESAP SET BAKIYE = BAKIYE + 1000 --2.Sorgu WHERE AD='İBRAHİM' AND SOYAD='BAYRAKTAR'
Havale işleminin gerçekleşmesi için bu iki sorgunun aynı anda gerçekleşmesi gerekir ve sistem kullanıcısı bu iki sorguyu birden çalıştırıyor. Şimdide örnek işlemimizde oluşabilecek olası hata senaryolarını inceleyelim.
Hata Olasılığı 1: Birinci SQL sorgumuzun çalışması fakat ikinci SQL sorgumuzda hata oluşması. Bu durumda Samet ULUTURK'ün hesabından 1000 TL eksilme olacak fakat İbrahim BAYRAKTAR'ın hesabında herhangi bir değişiklik olmayacaktır.
Hata Olasılığı 2: Birinci SQL sorgumuzda hata oluştu ve ikinci SQL sorgumuzun çalışması durumunda Samet ULUTURK'ün hesabından herhangi bir eksilme olmayacak fakat İbrahim BAYRAKTAR'ın hesabına 1000 TL eklenecek.
Örneğimizdeki gibi problemlerin ve olası hatalardan oluşacak karmaşanın önüne geçmek için "transaction" yapısını kullanmalıyız. "transaction" sayesinde her iki sorguda birden çalıştıralacak, iki sorguda başarılı ise "transaction" onaylanacak fakat herhangi bir hata durumunda he iki sorguda iptal edilecek.
"transaction" yapısını SQL kodlarında kullanırken COMMIT ve ROLLBACK komutları kullanılır.
COMMIT komutu ile çalıştırılan tüm SQL komutlarının başarılı olması halinde işlemler veri tabanına yansıtılır. ROLLBACK komutu ise herhangi bir hata oluşumunda tüm işlemleri geri alır.
Transaction Oluşturalım
BEGIN TRANSACTION BEGIN TRY UPDATE HESAP SET BAKIYE = BAKIYE - 1000 WHERE AD='SAMET' AND SOYAD='ULUTURK' UPDATE HESAP SET BAKIYE = BAKIYE + 1000 WHERE AD='İBRAHİM' AND SOYAD='BAYRAKTAR' COMMIT END TRY BEGIN CATCH ROLLBACK END CATCH
"BEGIN TRANSACTION" ile "transaction" işlemini başlatıyoruz. Tek bir komut gibi çalışmasını istediğimiz SQL kodlarımızı yazdıktan sonra "transaction" işlemini "COMMIT" ile sonlandırıyoruz. "COMMIT" komutuna gelene kadar işlemde hata olsa da olmasa da, işlem sonuçları tablomuza yansımayacaktır. "END TRY" ile blogumuzu kapatıyoruz. İşlemde bir hata ile karşılaşılması durumunda "BEGIN CATCH" blogu devreye girecek ve "ROLLBACK" komutu ile yapılan işlemler geri alınacak.
Çok güzel sade ve açık bir anlatım. Kendi adıma teşekkür ederim.
YanıtlaSilPaylaşım için, teşekkürler. Faydalı oldu benim için :)
YanıtlaSilPaylaşım için teşekkürler, benim için faydalı oldu :)
YanıtlaSilanlatım çok güzel
YanıtlaSilTeşekkürler
YanıtlaSilteşekkürler
YanıtlaSilÇok açıklayıcı, teşekkürler
YanıtlaSilTeşekkürler, açık ve net bilgilendirme olmuş.
YanıtlaSilArkadaşlar try bloğu iki sorgudan birisi doğru olduğunda catch bloğuna geçmez. Her ikiside yanlış olursa catch bloğuna geçer. Bu sorgulardan birisi doğru olursa doğru sorguda işlem yapılır ve yanlış olan sorguda işlem yapılmaz. Sorgunun birisi doğru olduğundan catch bloğuna geçmeyecek ve rollback çalışmayacak. Sorgunun birini doğru diğerini yanlış yapıp tablodaki değerlere bakarsanız ne demek istediğimi anlayacaksınız. Olması gereken @@ERROR ile hata denetimi yapıp hata sıfıra (0) eşitse commit çalışacak (-1) eşitse rollback çalışacak. iyi çalışmalar..
YanıtlaSilMerhaba,
YanıtlaSilAdsız'ın yorumu doğru ve yerinde. Bu yazımda catch'e düşmüyor. @@ERROR ifadesi ile sağlıklı sonuç alınabilir. Ama genel anlamda çok temiz bir anlatım olmuş. Emeğinize sağlık.