SqlTransaction Kavramı

Merhabalar;

Uzun zamandan bu yana makale yazamıyordum kafamı dagıtmak için çokdandır yazmak istediğim SqlTransaction konusunda makale yazmak istedim.

Kodlara başlamadan önce çok yüzeysel bir anlatımla bu sınıfın ne işe yaradıgını anlatmak istiyorum.

SqlTransaction sınıfı hatalı veya tutarsız veri yazılmasını önlemek için kullanılır. Bu konunun anlatımında en çok kullanılan örnek hesaplar arası para transferi örneğidir.

A hesabında B hesabını para havalesi yapılırken önce A hesabından havale miktarı düşülür B hesabına yazılır. Peki ama A hesabından havale miktarı düşüldü, ya tam B hesabına yazılacakken server kapandı yada durdu v.s herhangi bir sorun oldu ???? eee nolacak şimdi A hesabında para düşüldü B hesabına işlenemedi A hesabı sahibi mağdur durumda. Ya da tam tersini düşünürsek B hesabına para işlendi ama A hesabından düşülemediği için Banka hesaplarda havale miktarınca açık verecek.

Aynı işlem depolar arası transfer gibi bir çok örnekle anlatılabilir.

SqlTransaction sınıfı; işte bu tür transfer işlemlerinde senaryoda anlatılan problemlerin önüne geçmek için kullanılır. 1. tablodan silinen kayıt 2. tabloya başarılı bir şekilde işlenmemişse 1. tabloda ki değişiklikleri hemen geri alır, işlem başlamadan ki haline getirir. Bu kadar anlatımdan sonra kodları yazalım..

Tablomuz DEPO1 ve DEPO2 adında 2 tane biribirinin aynısı olacak...
CREATE TABLE [dbo].[DEPO1](
[ID] [int] IDENTITY(1,1) NOT NULL,
[URUNADI] [nchar](10) NULL,
[MIKTARI] [nchar](10) NULL
)


SqlConnection conn = new SqlConnection("Server=.;Database=TEST;Uid=sa;Pwd=123");

private void button1_Click(object sender, EventArgs e)
{
conn.Open(); //hepsinden önce bağlantı açılmış olmalı...SqlTransaction _transation; //SqlTransaction nesnemizi tanımlıyoruz
_transation = conn.BeginTransaction(); // Transaction ımızı başlattıkSqlCommand cmdDepo1 = new SqlCommand();
cmdDepo1.Parameters.AddWithValue("@MIKTAR", 1);

cmdDepo1.CommandText = "UPDATE DEPO1 SET MIKTARI=MIKTARI-@MIKTAR WHERE ID=1";
cmdDepo1.Connection = conn;
cmdDepo1.Transaction = _transation; //komut nesmeizin Transaction özelligine SqlTransaction ımızı atıyoruz.
SqlCommand cmdDepo2 = new SqlCommand();
cmdDepo2.Connection = conn;
cmdDepo2.Parameters.AddWithValue("@MIKTAR", 1);
cmdDepo2.CommandText="INSERT INTO DEPO2 VALUES('ELMA',@MIKTAR)";
cmdDepo2.Transaction = _transation;
try
{
cmdDepo1.ExecuteNonQuery(); //komutları çalıştırdık
cmdDepo2.ExecuteNonQuery();
_transation.Commit(); //hata yoksa verileri yolladık
}
catch
{
_transation.Rollback(); //hata varsa tüm değişikliker geri alıyor
}
finally
{
conn.Close(); //durum ne olursa olsun bağalantımızı kapadık.}

Bu örnekte aynı Database içinde SqlTransation uyguladık farklı Databaseler arasıda uygulamak mümkün.

Faydalı olmuş omasını diliyorum. Umarım herşey gönlünüze göre olur...

Tam gaz yola devam... Bol şannsssss.....

Yorum Gönder