Entity Framework Transaction Kullanımı

ismail kaşan
3 min readJul 26, 2019

--

Entity Framework Transaction Kullanımı

Entity Framework, .NET tabanlı bir ORM (Object-Relational Mapping) aracıdır. Veritabanına erişim sağlamak için ve gerekli “Sorgulama”, “Kaydetme”, “Güncelleme” ve “Silme” gibi işlemleri kolayca yapmamızı sağlayan bir kütüphanedir. .NET platformunda kod yazanlar zaten bolca bu kütüphaneyi kullanmaktadır. .NET’in son sürümlerinde oldukça iyi iyileştirmeler yapılmıştır.

Transaction Nedir ?

Transaction bir veri tabanındaki bir sürü işlemi içeren mantıksal bir birimdir. Bu işlemler, veritabanındaki verilerin tutarlılığını ve bütünlüğünü sağlamak için kullanılır. Bu işlemler genellikle ACID(Atomicity, Consistency, Isolation, Durability) özelliklerini takip eder.

  • Atomicity: Bir transaction ya tamamen gerçeklşir ya da hiç gerçekleşmez. Transaction bir noktada başarısız olursa, diğer tüm aşamalar geri alınır.
  • Consistency: Bir transaction veritabanını, bir tutarlılık durumundan başka bir tutarlılık durumuna geçirmesine denir.
  • Isolation: Transation’lar birbirinden izole edilmiştir. Yani bir transaction’in başka bir transaction’dan etkilenmesi engellenmiştir. Bu, bir transaction’ın sonuçlarının diğer transaction’lar üzerinde etkili olmasını önler.
  • Durability: Bir transaction başarıyla tamamlandığında, değişiklikler kalıcı olmalıdır. Yani, güç kesintisi veya sistem çökmesi gibi durumlarda veritabanındaki değişiklikler korunmalıdır.

Örneğin, bir banka işlemi düşünelim. Bir kişi bir hesaptan diğerine para transfer ediyorsa, bu bir transaction’dır. Eğer para transferi başarılı olursa veri tabanındaki bütün hesap bakiyeleri güncellenir; ancak bir hata olursa, transation geri alınır ve bakiyeler önceki duruma getirilir. Bu, transaction’nın atomik olmasını sağlar.

Entity Framework bu özellikleri desteklemektedir. Veritabanında bir ya da birden fazla işlemin(örneğin, ekleme, silme, güncelleme gibi ) tek bir tarnsaction(mantıksal işlem) ile yapılmasını sağlayan bir yapısı vardır. Bu yapı bizlere transaction’nın başarılı bir biçimde gerçekleşip gerçekleşmeme drumlarına göre işlem yapmamıza olanak sağlar. Başarılı işlem sonucunda “Commit” işlemi veyahut başarısız bir durumda “Rolback” işlemi yapabiliriz.

Entity Framework ile transaction kullanmak için, DbContext sınıfının Database.BeginTransaction() metodu kullanılır. Bu metot, veritabanı işlemlerini başlatır ve geri alınabilir bir transaction nesnesi döndürür. Ardından, işlemler gerçekleştirilir. İşlem başarılı bir şekilde tamamlandığında, transaction.Commit() metodu kullanılarak işlem onaylanır. Hata oluşması durumunda ise, transaction.Rollback() metodu kullanılarak işlem geri alınır.

BeginTransaction(), Commit(), Rolback() Kullanımı

Genellikle transaction başlatma işlemleri try-catch blokları ile yapılır. Her hangi bir hata durumunda catch bloğu ile işlemler geri alınır.

using (var dbContext = new YourDbContext())
{
using (var transaction = dbContext.Database.BeginTransaction())
{
try
{
// database işlemleri burada yapılır.

// Herşey başarılı ise işemler commit edilir.
transaction.Commit();
}
catch (Exception)
{
// Herhangi bir hata durumunda işlemler geri alınır.
transaction.Rollback();
}
}
}

İzolasyon Seviyeleri(Isolation Levels)

Entitiy Framework, farklı izolasyon seviyelerini desteklemektedir. Bunlar; ReadUncommitted, ReadCommitted, RepeatableRead, ve Serializable. Bunlar transaction’lar arasındaki isolasyon seviyelerini belirtir.

  1. ReadUncommitted: Diğer transaction’lar tarafından hala işlemi bitmemiş verileri de okumamıza izin veren bir izolasyon seviyesidir. Kendi içinde farklı özellikleri vardır. Bunlar;

    Dirty Reads(Kirli okuma): Başka transaction’lar üzerinde işlemi devam eden ve henüz onaylanmamış verileri okumamıza izin verir.

    Non-Repeatable Reads(Tekrarlanmayan okumalar) : Bir transaction, aynı sorguyu tekrarladığında, diğer transaction’lar tarafından yapılan değişiklikleri görebilir. Bu, aynı veriyi iki kez sorguladığınızda farklı sonuçlar almanıza neden olur. Çünkü veri güncellenmiştir.

    Phantom Reads(Hayalet okumalar): Bir transaction, bir sorguyu tekrarladığında, diğer transaction’ların yeni satır eklediğini görebilir. Bu, aynı sorguyu çalıştırdığında veri kümesine yeni eklenen satırlar olacaktır.
  2. ReadCommitted: Bir transaction tarafından bir veri üzerinde işlem yapılacaksa, bu verinin başka transactionlar tarafından yapılan işlemlerinin bitmiş ve onaylanmış olması gerekmektedir. Yoksa işlemi yapacak transaction diğer transaction’ların işlerini bitirmesini bekleyecektir.
  3. RepetableRead: Bir transaction sırasında diğer transaction’lar tarafından yapılan değişiklikleri görmesine ve aynı sorguyu tekrarladığında aynı sonuçları getirmesine izin verir. Yani veri üzerinde işlem yapan bütün transaction’ların işlerini bitirmesini bekler. Bu seviye ReadCommitted’ten daha fazla izolasyon sağlar.
  4. Serializable: Veritabanında en yüksek izolasyon düzeyini sağlar. Bu seviye, bir transaction sırasında diğer transaction’lar tarafından yapılan değişiklikleri görmesini, aynı sorguyu tekrarladığında aynı sonuçları görmesini ve yeni satırların eklenmesini önlemesini sağlar. SERIALIZABLE seviyesi, diğer işlemlerin tamamını tamamlamasını bekler ve bu süre boyunca ilgili verileri kilitleyerek diğer işlemlerin müdahalesini önler.

Transaction Başlatırken İzolasyon Seviyesi Belirleme

Entitiy Framework, farklı izolasyon seviyelerini desteklemektedir demiştik. BeginTranstion() metoduna parametre olarak System.Data.IsolationLevel enum değerinden izolasyon seviyesi verebiliriz.

using (var transaction = dbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
// database işlemleri burada yapılır.
transaction.Commit();
}

Veritabanındaki verilerin tutarlılığını ve bütünlüğünü sağlamak için veri tabanı sistemleri genellikle ACID(Atomicity, Consistency, Isolation, Durability) kurallarına göre dizayn edilir. Izolasyon seviyelerine göre de bu özelliklerin kullanımı belirlenir. Ayrıca kullanıcıların hangi seviyede çalışmak istiyorlarsa, izolasyon seviyesi belirleyebilirler. İşte bu noktada Entitiy Framework bizlere bu olanakları kullanma fırsatı sunar. Yoğun bir şekilde veritabanı ile işlem yapılıyorsa, ve verilerin tutarlılığı belli bir ölçüde önemli ise, bir izolasyon seviyesi belirlenmelidir. Veri tabanı işlemlerinde bu izolasyon seviyesine göre Transaction’lar başlatılmalıdır.

Umarım faydalı olmuştur.

Yararlanılan kaynaklar
https://learn.microsoft.com/en-us/ef/ef6/saving/transactions

--

--

ismail kaşan
ismail kaşan

Written by ismail kaşan

I am a full stack developer since 2016.

Responses (1)