Aracılığıyla paylaş


İşlem işleme hatalarını işleme

Dekont

EF6.1 Yalnızca Devamı - Bu sayfada açıklanan özellikler, API'ler vb. Entity Framework 6.1'de sunulmuştur. Önceki bir sürümü kullanıyorsanız, bilgilerin bir kısmı veya tümü geçerli değildir.

6.1'in bir parçası olarak EF için yeni bir bağlantı dayanıklılığı özelliği sunuyoruz: geçici bağlantı hataları işlem işlemelerinin onayını etkilediğinde otomatik olarak algılama ve kurtarma özelliği. Senaryonun tüm ayrıntıları en iyi blog gönderisinde SQL Veritabanı Bağlan ivity ve Idempotency Sorunu'nda açıklanmıştır. Özetle, senaryo bir işlem işlemesi sırasında bir özel durum oluştuğunda iki olası nedenin olmasıdır:

  1. İşlem işleme sunucuda başarısız oldu
  2. İşlem işleme sunucuda başarılı oldu ancak bağlantı sorunu, başarılı bildirimin istemciye ulaşmasını engelledi

İlk durum gerçekleştiğinde uygulama veya kullanıcı işlemi yeniden deneyebilir, ancak ikinci durum oluştuğunda yeniden denemelerden kaçınılmalıdır ve uygulama otomatik olarak kurtarılabilir. Zorluk, işleme sırasında bir özel durumun bildirildiği gerçek nedeni algılama yeteneği olmadan uygulamanın doğru eylem seyrini seçememesidir. EF 6.1'deki yeni özellik, EF'in işlemin başarılı olup olmadığını veritabanıyla bir kez daha denetlemesine ve doğru eylemi şeffaf bir şekilde gerçekleştirmesine olanak tanır.

Özelliği kullanma

İhtiyacınız olan özelliği etkinleştirmek için DbConfiguration'ınızın oluşturucusunda SetTransactionHandler çağrısı ekleyin. DbConfiguration'ı bilmiyorsanız bkz. Kod Tabanlı Yapılandırma. Bu özellik, EF6'da sunduğumuz otomatik yeniden denemelerle birlikte kullanılabilir ve bu da işlemin geçici bir hata nedeniyle sunucu üzerinde işlenememesine yardımcı olur:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServer;

public class MyConfiguration : DbConfiguration  
{
  public MyConfiguration()  
  {  
    SetTransactionHandler(SqlProviderServices.ProviderInvariantName, () => new CommitFailureHandler());  
    SetExecutionStrategy(SqlProviderServices.ProviderInvariantName, () => new SqlAzureExecutionStrategy());  
  }  
}

İşlemler nasıl izlenir?

Özellik etkinleştirildiğinde EF veritabanına otomatik olarak __Transactions adlı yeni bir tablo ekler. EF tarafından her işlem oluşturulduğunda bu tabloya yeni bir satır eklenir ve işleme sırasında bir işlem hatası oluşursa bu satır var olup olmadığını kontrol eder.

EF, artık gerekli olmayan satırları tablodan ayıklamak için en iyi çabayı gösterse de, uygulamadan erken çıkılırsa tablo büyüyebilir ve bu nedenle bazı durumlarda tabloyu el ile temizlemeniz gerekebilir.

Önceki sürümlerle işleme hatalarını işleme

EF 6.1'in öncesinde EF ürününde işleme hatalarını işlemeye yönelik bir mekanizma yoktu. Ef6'nın önceki sürümlerine uygulanabilecek bu durumla başa çıkmanın birkaç yolu vardır:

  • Seçenek 1 - Hiçbir şey yapma

    İşlem işleme sırasında bağlantı hatası olasılığı düşüktür, bu nedenle bu koşul gerçekten oluşursa uygulamanızın başarısız olması kabul edilebilir olabilir.

  • Seçenek 2 - Durumu sıfırlamak için veritabanını kullanma

    1. Geçerli DbContext'i at
    2. Yeni bir DbContext oluşturun ve uygulamanızın durumunu veritabanından geri yükleyin
    3. Kullanıcıya son işlemin başarıyla tamamlanmamış olabileceğini bildirin
  • Seçenek 3 - İşlemi el ile izleme

    1. İşlemlerin durumunu izlemek için kullanılan veritabanına izlenmeyen bir tablo ekleyin.
    2. Her işlemin başında tabloya bir satır ekleyin.
    3. İşleme sırasında bağlantı başarısız olursa, veritabanında ilgili satırın olup olmadığını denetleyin.
      • Satır varsa, işlem başarıyla işlendiğinden normal şekilde devam edin
      • Satır yoksa, geçerli işlemi yeniden denemek için bir yürütme stratejisi kullanın.
    4. İşleme başarılı olursa, tablonun büyümesini önlemek için ilgili satırı silin.

Bu blog gönderisi , SQL Azure'da bunu gerçekleştirmek için örnek kod içerir.