2011-02-28 9 views
8

Veri güncelleme/yeniden kazanma için LINQ aracılığıyla erişilen bir MS SQL 2008 veritabanına sahibim.Entity Framework ile bir veritabanına eşzamanlı erişim == EntityException

Benim linq'm yoğun bir uygulama için bir PerCall örnekleme modunda WCF servisleri tarafından erişilir. Bu uygulama, hizmete çağrı yapan birkaç iş parçacığına sahiptir ve birkaç uygulama da gün içinde çalışmaktadır.

System.Data.EntityException yakalandı İleti sağlayıcı bağlantısı üzerinde bir işlem başlatılırken bir hata oluştu:

sık sık oluyor bazı EntityException ettik. Ayrıntılar için iç istisna bakınız. Kaynak = System.Data.Entity StackTrace: System.Data.Objects.ObjectContext.SaveChanges de System.Data.EntityClient.EntityConnection.BeginTransaction() de System.Data.EntityClient.EntityConnection.BeginDbTransaction (ısolationlevel IsolationLevel) de (SaveOptions seçenekler) D Infoteam.GfK.TOMServer.DataServer.DataServer.SaveChanges() en : \ Çalışma \ XYZWASDF \ DataServer \ DataServer.cs: hattı 123 InnerException: System.Data.SqlClient.SqlException Mesaj = Une nouvelle işlem n'est pas autorisée parce que d'autres konuları en cours d'exécution dans la oturumu. Kaynak = .NET SqlClient veri sağlayıcısı HataKodu = -2146232060 Sınıf = 16 LineNumber = 1 sayısı = 3988 Prosedür = "" Sunucu = ift-srv114 Devlet = 1 StackTrace: System.Data.SqlClient at System.Data.SqlClient.SqlInternalConnection.OnError de .SqlConnection.OnError (SqlException istisna, Boole breakConnection) (SqlException istisna, Boole breakConnection) System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning de () System.Data.SqlClient de . TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHand ler, TdsParserStateObject stateObj) System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest de (byte [] tamponu, TransactionManagerRequestType talep String transactionName, TransactionManagerIsolationLevel isoLevel, ınt32 zaman aşımı, SqlInternalTransaction işlem, TdsParserStateObject stateObj, Boole isDelegateControlRequest) System.Data.SqlClient de Sistem de System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction de .SqlInternalConnectionTds.ExecuteTransactionYukon (transactionRequest transactionRequest, dize transactionName, ısolationlevel iso, SqlInternalTransaction internalTransaction, Boole isDelegateControlRequest) (transactionRequest transactionRequest, dize adı, ısolationlevel iso, SqlInternalTransaction internalTransaction, Boole isDelegateControlRequest) .Data.SqlClient.SqlInternalConnection.BeginSqlTransac System.Data.Common.DbConnection.BeginTransaction de System.Data.SqlClient.SqlConnection.BeginDbTransaction (ısolationlevel IsolationLevel) de System.Data.SqlClient.SqlInternalConnection.BeginTransaction (ısolationlevel izo) de tion (ısolationlevel izo String transactionName) (System.Data.EntityClient.EntityConnection.BeginDbTransaction at ısolationlevel IsolationLevel) (ısolationlevel IsolationLevel) InnerException:

(Maalesef çok okunabilir değil). (Dahili istisnanın mesajı "Yeni bir işleme izin verilmez, çünkü oturumda çalışan başka konular vardır."

Ben bu istisna yaptığında bunun tamamen rastgele değil, ben bir döngü içinde değilim, kontrol ettik ve bunu önlemek konusunda hiçbir fikrim herhangi bir yardım gerçekten takdir edilecektir

.:)

teşekkür ederiz

EDIT: burada kodunuzu görmeden BAZEN

//My DataServer method, which is a singleton 

    [MethodImpl(MethodImplOptions.Synchronized)] 
      public void SaveChanges() 
      { 
       lock (_lockObject) 
       { 
        try 
        { 
         _context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
         _changeListener.ManageIDAfterInsert();      
        } 
        catch (Exception ex) 
        { 
         Logger.Instance.Error("[DataServer:SaveChanges] Got an error when trying to save an object", ex); 
         //HERE I've this error 
        } 
       } 
      } 

//One example where I can have exception sometimes, this is called through a WCF service, so I have a method which attach the object and then save it 
private OrderStatus AddOrderStatus(OrderStatus orderStatus) 
     { 
      DataServer.DataServer.Instance.InsertOrUpdateDetachedObject(orderStatus); 

      return orderStatus; 
     } 
+1

Bu hataya neden olan kodu gösterebilir misiniz? –

cevap

7

bu istisnayı nereden örneğidir, kısa cevap olmasıdır EntityFram Ework iplik güvenli değildir. İki + ileti dizisi, ObjectContext'unuza erişmeyi denediğinizde çakıştığında bu hatayı rastgele bir şekilde görüyorsunuz. Bağlamınızı static değişkenine dahil ettiğinizi varsayalım. Bağlamı yerel bir değişken yapın ya da ObjectContext'a erişim etrafında kilitleme yazın.

Eğer daha spesifik bir cevap istiyorsanız, kodunuzun gönderilmesi yardımcı olacaktır.

Düzenleme

Sorununuz iki iş parçacığı aynı anda bağlamı kullanmaya çalıştığınız veya 1 diş sonra bir hareketi açık bırakıyor ve ikinci bir iplik sizin tekil içerik kullanmaya çalışıyor yoluyla geliyor olmasıdır. Kod snippet'iniz daha önce yaptığımdan daha fazla soru soruyor.

  • Kod örneğinizde _ lockObject statik bir değişkendir?
  • Neden kilidi SaveChanges içinde gösteriyorsunuz, ancak InsertOrUpdateDetachedObject'dan bir hata atılıyor mu açıklıyorsunuz? InsertOrUpdateDetachedObject kodunu görebilir miyiz?
  • SaveChanges, aynı bağlama doğrudan erişen tüm diğer yöntemler gibi aynı _lockObject mu kullanıyor?
  • Aramanız _context.SaveChanges numaralı aramayı DB'ye kaydetmenin tek yolu mı, yoksa işlem bağlamlarını kendi başlarına açan başka alanlara sahip mi?
  • Tekil kullanımınız için, içeriğiniz birden çok çağrıda paylaşılır. Her WFC çağrısı için yeni bir yeni bağlamın oluşturulması tercih edilebilir.
+0

Bazen bazı çökmeler aldığım bir örnek ekledim. Veri sunucusunu oluşturan DataServer'ım bir singleton'dur, ama sanırım farklı bir çağnın çağrısı olan bir PerCall örneğinin aynı bağlamda olmadığına inanıyorum – J4N

+0

Merhaba Yukarıdaki yanıtı alamadım. Onu benim için açabilir misin? – JGC