Yoğun bir şekilde veritabanı ile işlem yapıyorsanız,verilerin tutarlılığı açısından Transaction kullanımı olmazsa olmazdır.Çoğu zaman önemsenmez ama canlıya çıkıldığında ve verilerin tutarsız bir şekilde kaydedilmeye başlandığında başınız epeyce ağrıyacaktır.

Şimdi şöyle bir senaryo düşünelim. Veri tabanında 2 tane tablomuz olsun. Bu tablolardan biri Kullanıcı tablosu olsun,diğeri de Firma tablosu olsun. Yani her firmanın kullanıcıları bu Kullanıcı tablosunda tutulsun. Dolayısıyla Firma ve Kullanıcı tablosu arasında one-to-many ilişkisi var.

Bu senaryoda bir tane metodunuz olsun. Bu metod önce gidip firma ekliyor. Sonrada eklediği firmaya kullanıcı ekliyor. Ama firmayı ekledikten sonra kullanıcı eklerken hataya düştü diyelim. Sonuç itibarı ile firma var ama kullanıcılar eklenmedi. 

İşte böyle senaryolarda tüm işlem bitmeden kayıt işlemlerini kontrol edebileceğimiz yada geri çekebileceğimiz bir yapı mevcut. Bu yapıya  SQL Transaction deniyor.

Transaction Nasıl Kullanılır?

Bir tabloda işlem yapıyor olun. Bu işlem ister insert, update,  delete işlemi olsun. Bu noktada eğer yapacağınız işlem farklı bir veya bir kaç noktayı etkileyecek ise ve bu noktaların bir tanesinde dahi hata almanız durumunda yapılan tüm işlemleri (o esnada) geri almak istiyorsanız kesinlikle ihtiyaç duyacağınız bir metoddur Transaction kavramı.

İşlemlere hiç başlamadan önce bir Transaction açılır ve sizin kod tarafındaki işleminiz (döngü veya ardı ardına gelen farklı insert/update/delete işlemleri olabilir) bitip de siz transaction’ı kapatana (commit) kadar o tabloya farklı uygulamalardan veya noktalardan gelen tüm talepler kısa süreli beklemeye alınır ve sizin işleminiz daha uzun sürecek ise timeout verilerek geri çevrilir. İşte bu da, aynı tablo veya kayıt üzerinde birden fazla kişinin aynı anda işlem yapmasının önüne geçmiş olur.

Transection objesi System.Data.Entity namespace nin altında bulunuyor.Aşagıdaki metoda bakarsanız biraz fikriniz oluşabilir.

[csharp]public JsonResult AxDepoHareket(int[] TABLEID, int BOLMEID){    var trans = db.Database.BeginTransaction();    try    {        foreach (int item in TABLEID)        {            var guncelle = db.TBLSTOKHAREKET.Find(item);            guncelle.BOLMEID = BOLMEID;            db.SaveChanges();         }         trans.Commit();         return Json(new AjaxResult(true, 0, "Başarılı!", null));     }     catch (Exception ex)     {         trans.Rollback();         Log.ExceptionLogla(ex, this.ControllerContext);         return Json(new AjaxResult(true, 0, "Başarısız!", null));      }}[/csharp]

Örnek koda bakıldığında metod BeginTransaction() ile başlayıp transaction açmış.

[csharp] var trans = db.Database.BeginTransaction(); [/csharp]

Veritabanı işlemleri bitince SaveChanges() çağırmasına rağmen  Commit() çağrılmadan değişiklikler veritabanına yansımıyor taki trans.Commit() çağrılana kadar.

[csharp] trans.Commit(); [/csharp]

Eğer hataya düşerse Rollback() ile yaptığı tüm işlemleri geri çekiyor.

[csharp] trans.Rollback();[/csharp]

Umarım faydalı olmuştur.Diğer yazılarda görüşmek üzere.

Yararlanılan kaynaklar