DbTransaction Nesnesi

Klasik bir örnek ile başlayacak olursak; Bir arkadaşınızın hesabına havale yaptığınızı düşünelim. Parayı ATM cihazından veya internet bankacılığından yatırıyor ve hesap numarasını giriyorsunuz. Bu sırada göndermek istediğiniz tutarı da yazdıktan sonra işlemi onaylıyorsunuz. Insert sorgusu çalışmaya başladı fakat bir hata oldu ve para kayboldu. Para yatırdığınızı nasıl ispatlayabilir siniz? Bu noktada çok kullanışlı ve faydalı olan bir Nesne olmasaydı paranız arkadaşınızın hesabına geçmeyecek ve kaybolacaktı. Transaction nesnesi bir hata oluştur ise yapılan bütün işlemi geri alıp hiçbir şey olmamış gibi işlemi sonlandırır. Bu sayede bir hata olursa paranız size iade edilir gibi düşünebilirsiniz. Gelin C# ile DbTransaction kullanımının nasıl olduğunu inceleyelim.

[csharp]

const string dbyol="Data Source=.;Initial Catalog=TESTDB;User ID=sa;Password=1";
private void btnHataVerme_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(dbyol);
if (con.State!=ConnectionState.Open)
{
con.Open();
}
SqlCommand cmd = new SqlCommand("insert into Personel(Adi,Soyadi) values (@Adi,@Soyadi)", con);
cmd.Parameters.AddWithValue("@Adi", "Mesut");
cmd.Parameters.AddWithValue("@Soyadi", "GÜNEŞ");
//Transaction Tanımlayalım
SqlTransaction oTrs = con.BeginTransaction();
//Transaction nesnemizi command nesnemize ilişkilendirelim.
cmd.Transaction = oTrs;
try
{
cmd.ExecuteNonQuery();
//Hata vermediği için işlemi kalıcı yapalım.
oTrs.Commit();
}
catch
{
//İşlem başarısız olursa yapılan işlemleri geri alalım.
oTrs.Rollback();
}
finally
{
//bağlantıyı kapatalım ve command nesnemizi bellekten atalım.
con.Close();
cmd.Dispose();
}
}

private void btnHataVer_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(dbyol);
if (con.State != ConnectionState.Open)
{
con.Open();
}
SqlCommand cmd = new SqlCommand("insert into Personel(Adi,Soyadi) values (@Adi,@Soyadi)", con);
cmd.Parameters.AddWithValue("@Adi", "Mesut");
cmd.Parameters.AddWithValue("@Soyadi", "GÜNEŞ");
//Transaction Tanımlayalım
SqlTransaction oTrs = con.BeginTransaction();
//Transaction nesnemizi command nesnemize ilişkilendirelim.
cmd.Transaction = oTrs;
try
{
cmd.ExecuteNonQuery();
//Burada işlemlerin geri alındığını görmek için sistem hatası verdirelim.
throw new Exception("Mesut Hata Vermeni Söyledi");
//Hata vermediği için işlemi kalıcı yapalım.
oTrs.Commit();
}
catch
{
//İşlem başarısız olursa yapılan işlemleri geri alalım.
oTrs.Rollback();
}
finally
{
//bağlantıyı kapatalım ve command nesnemizi bellekten atalım.
con.Close();
cmd.Dispose();
}
}

[/csharp]

Not: Transaction işleminde işlem başarılı olursa Commit() ile bilgiler kalıcı olarak veritabanına yazılır.

Eğer bir hata meydana gelir ise Rollback() ile bütün işlem geri alınarak ilk haline gelinmiş olur.

Ekran Görüntümüz

İşlem başarılı olduğu için Sql’de Commit ile işlem kalıcı olarak veritabanına yazılıyor.

İşlem başarısız olduğunda ise sistem Rollback ile yapılan işlemleri geri alıyor ve kayıt eklenmiyor veritabanına.

Konu ile ilgili sorularınızı yorum panelinden bana iletebilirsiniz. Kodlar sade olduğu için her satırı açıklama gereksinimi duymadım.

Mesut Güneş

Selçuk Üniversitesi Bilgisayar programcılığı bölümünden mezun olduktan sonra birçok firmada Yazılım, İş zekası ve Veritabanı Uzmanı olarak çalıştım. Şuan Türkiye’nin en büyük şirketlerinden biri olan Doğan Online’da Veritabanı Yöneticisi olarak çalışıyorum.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.