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.

İş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.