C# Sql Transaction
Çoğu uygulama veriler ve bu verileri tutan veritabanları ile çalışırlar. Bu yüzden veri, programlama yapan kişiler için çok önem verilmesi gereken bir konudur. Hiçbir şekilde veritabanında bir tutarsızlığın olmaması gerekir. Örneğin, SQL Server’da bazen ana tablolara ve bu ana tablolarla ilişkili alt tablolara veri eklemeniz gerekir. Yukarıdaki görev sırasında ana tabloya bir satır eklediyseniz ve sonra bir hata oluştu ise, o zaman bu görev ne olurdu? Hatadan dolayı, ilişkili olan alt tablolarımıza veriler eklenemez ve ana tabloya eklenmiş olan veriyi de geri almanız gerekirdi ki aksi takdirde veri tutarsızlığı kaçınılmaz olurdu. Burada TRANSACTION bu şekilde eklenmesi gereken parçalı veri işlemlerinin başarılı bir şekilde gerçekleştiğinden emin olmak için hayati bir rol oynamaktadır.
C# Sql Transaction Nedir?
Transaction, özet olarak daha küçük parçalara ayrılamayan işlem demektir. Özellike bir grup işlemin arka arkaya gerçekleşiyor olmasına rağmen, seri işlemler halinde ele alınması gerektiğinde kullanılır. Transaction bloğu içerisindeki işlemlerin tamamı gerçekleşinceye kadar hepsi gerçekleşmemiş varsayılır. Bir işlem başarılı olursa, tüm veri işlemleri gerçekleştirilir ve veritabanının tutarlı bir parçası haline gelir. Bir işlem hatalarla / istisnalarla karşılaşırsa tüm veri değişiklikleri ve işlemleri kaldırılarak tutarsız veri girişinin önüne geçilmiş olur.
Bir örnek ile konuyu daha iyi açıklamaya çalışalım: Bir bankada hesaplar arası bir para transfer işlemi olduğunu varsayalım. Bankada Hesap1’den Hesap2’ye para aktarım işlemi yapılacak. Bu süreç iki işlemden oluşur: Öncelikle Hesap1 üzerinden aktarılmak istenen bedel Hesap1 bakiyesinden veritabanında güncelleme ile düşülür. Sonrasında ise Hesap2 hesap bakiyesi veritabanında güncelleme ile yükseltilir. Para aktarımı bu iki işlem başarılı olursa tamamlanır. Eğer, işlem 1 başarılı olur, ancak işlem 2 başarısız olur ise, Hesap2’ye para gitmediği gibi Hesap1 de boşuna para kaybetmiş olacaktır. Bu olursa, çok kötü olur ve kimse böyle bir durumu kabul etmeyecektir ki bu tarz işlemlerde C# Sql Transaction kullanımı olmazsa olmazdır.
Son olarak aşağıda basit manada hazırlanmış bir kod parçacığı paylaşarak yazıya noktayı koyalım. Umarım faydalı olur.
string baglantiAdresi = "Server=127.0.0.1;Database=Test;User Id=sa;Password=123456;";// Bu alanı kendi bağlantı bilgileriniz ile güncelleyin ... SqlTransaction islem = null; //Transaction değişkenimizi tanımlıyoruz //SQL bağlantımızı oluşturuyoruz using (SqlConnection baglanti = new SqlConnection(baglantiAdresi)) { baglanti.Open();//SQL bağlantımızı açıyoruz islem = baglanti.BeginTransaction();//SQL bağlantımız için Transaction işlemini başlatıyoruz SqlCommand komut1 = new SqlCommand("insert into SiparisTablosu (siparisID, siparisAciklamasi) values(1, 'TestSiparis')", baglanti);//İlk parça insert işlemini SQL'e gönderecek komutu yazıyoruz SqlCommand komut2 = new SqlCommand("insert into SiparisAyrintiTablosu (SiparisID, SatirNO, SatirAciklamasi) values(1, 1, 'Test Satiri')", baglanti);//İkinci parça insert işlemimizi de SQL'e gönderecek komutu yazıyoruz try { //try catch bloğu içinde komutlarımızı SQL'e gönderiyoruz komut1.ExecuteNonQuery(); komut2.ExecuteNonQuery(); //İki işlemimizde işlenirken bir hata gerçekleşmez ise Transaction işlemini onaylıyoruz islem.Commit(); } catch (Exception hataMesaji) { //Bu blok çalışırsa try bloğu içinde herhangi bir yerde hata oluşmuş demektir ki o zaman SQL'e yazılan verileri geri alıyoruz islem.Rollback(); //Verilen hatayı bir mesaj kutusunda programa gönderiyoruz MessageBox.Show(hataMesaji.ToString()); } finally { //İşlem başarılı da olsa hatalı da olsa sonuç olarak SQL bağlantımızı kapatıyoruz baglanti.Close(); } }
merhaba, öncelikle yazınız çok faydalı oldu teşekkürler. Sadece komut1.ExecuteNonQuery(); ‘den hemen önce komut1.Transaction = islem; yazmak gerekiyor yoksa hata veriyor bunu belirtmek istedim. İyi çalışmalar
cok temiz bir anlatım yazılım geliştirici olarak 100 ustunden 100 veriyorum iyi calısmalar..
C# üzerinde anlatım kısa, öz ve anlaşılır olmuş.
Komuta atanan bağlantı beklemedeki yerel işlem içinde olduğunda, ExecuteNonQuery komutunun bir işleme sahip olması gerekir. komutun Trunsaction özelliği başlatmamış HATASI ALIYORUM YUKARIDAKİ AYNISINI YAZDIM