2014-07-11 31 views
40

Birden çok eşzamansız Entity Framework sorgusu başlattığımızda ve bunları paralel olarak çalıştırdığınızda ne olur?Entity Framework paralel eşzamanlı sorguları destekliyor mu?

Fiziksel olarak paralel olarak yürütülürler mi? Entity Framework tarafından serileştiriliyorlar mı? Bu desteklenmiyor mu? Bir istisna ile sonuçlanır mı?

public async Task QueryDatabase() 
{ 
    using (var context = new MyDbContext()) 
    { 
     Task task1 = context.SomeTable1.ToListAsync(); 
     Task task2 = context.SomeTable2.ToListAsync(); 

     await Task.WhenAll(task1, task2); 
    } 
} 

cevap

50

Bu specifications of version 6 göre desteklenmez.

Bu

tamamlanmış bir önceki asenkron operasyon öncesi ikinci operasyon bu bağlamda başladı

söyleyerek DbConcurrencyException özel durum oluşturması gerekir. zaman uyumsuz işlemlerinin bu bağlamda başka bir yöntem çağrılmadan önce tamamlandığından emin olmak için 'bekle' seçeneğini kullanın. Herhangi bir üye üyenin numaralı kasada emniyetli olması garanti edilmez. geliştirici bir zamanlar iki zaman uyumsuz işlemlerini yürütmek ve atmak çalışırsa

EF algılayacaktır.

a codeplex page of the project itibaren

: veritabanı işlemleri asenkron yürütme etkinleştirilmesi

aslında aynı bağlamına eşzamanlı yürütülmesini sağlayan etmek diktir. 'da, eşzamanlı erişimi kullanarak sunucu senaryolarının özel durumu , işleminin tek bir istek için farklı iş parçacıklarının rasgele bir sayısının döndürülmesi anlamına geleceği anlamına gelen ölçeklenebilirliği olumsuz yönde etkileyebilir. Tüm iş parçacıkları, gibi diğer kaynaklar için, diğer eşzamanlı istekleri için gerekli olan diğer iş parçacıkları gibi kaynaklar için rekabet eder.

+3

Doğruluktan dolayı, Codeplex snippet'ini yazan kişiyi reddedebilirdim. İyi bir sorgu neredeyse tümüyle çoklu CPU ve çoğu durumda ağa bağlı olan db'ye bir vuruştur. Db paralel async çağrıları bir demet atma NO iş parçacığı kullanır! http://blog.stephencleary.com/2013/11/there-is-no-thread.html Tüm sorgular .AsNoTracking() ise, EF'in bunu desteklemesi önemsiz olmalıdır, ancak yine de bu istisnayı atar. –

+0

@ChrisMoschini Son cümlenin EF'ye değil SQL Server'a itirazda olduğundan eminim. –

+0

@ErikPhilips Ne demek istediğinizden emin değil misiniz? –

2

Sadece bir not, ken2k tarafından belirtildiği gibi, Entity Framework ile MS SQL Server kullanıldığında buna izin verilmez. Ancak, Oracle ile Varlık Çerçevesi kullanıyorsanız, buna izin verilir.

+3

Bunun için bir kaynak verebilir misiniz? Benim izlenimim, EF'nin dahili olarak birden fazla sorguyu aynı anda çalıştıramamasıydı.Bu, kimlik eşlemesi gibi iç yapılarının iş parçacığı güvenli olmasını gerektirir. – usr

+2

Bir kaynak veremiyorum söyleyebileceğim tek şey, bu yöntemi kullanan prodüksiyonda kodum var. – jkruer01

+2

Parmaklarınızın kesilmesi parmaklarınız gece dışarı çıkmayacak. Bunu bildirdiğiniz için teşekkürler. – usr