Mehrere dbcontexts in parallelen Threads, EntityException "Führen Sie die Anweisung erneut aus, wenn weniger aktive Benutzer vorhanden sind"

8

Ich verwende Parallel.ForEach , um mehrere Threads zu bearbeiten, indem ich für jede Iteration einen neuen EF5 DbContext verwende, der wie folgt in einem TransactionScope eingeschlossen ist:

%Vor%

Nach ein paar Minuten wird eine EntityException ausgelöst "Der zugrunde liegende Provider ist beim Öffnen fehlgeschlagen" mit folgendem inneren Detail:

"Die Instanz des SQL Server-Datenbankmoduls kann zu diesem Zeitpunkt keine LOCK-Ressource abrufen. Führen Sie die Anweisung erneut aus, wenn weniger aktive Benutzer vorhanden sind. Bitten Sie den Datenbankadministrator, die Sperr- und Speicherkonfiguration für diese Instanz zu überprüfen langlaufende Transaktionen. "

Weiß jemand, was das verursacht oder wie es verhindert werden kann? Danke.

    
Matt Sharpe 14.02.2013, 10:46
quelle

3 Antworten

6

Sie können auch versuchen, die maximale Anzahl gleichzeitiger Aufgaben in der Methode Parallel.ForEach() mit new ParallelOptions { MaxDegreeOfParallelism = 8 } zu setzen (ersetzen Sie 8 durch das, was Sie begrenzen möchten.)

Weitere Informationen finden Sie MSDN .

    
bmdixon 14.02.2013, 11:59
quelle
1

Sie sollten auch herausfinden, warum Ihre App so viele Sperren verwendet? Sie haben ein TransactionScope um mehrere db-Verbindungen gewickelt. Dies verursacht wahrscheinlich eine verteilte Transaktion, die damit zu tun haben könnte. Es führt sicherlich dazu, dass Schlösser niemals bis zum Ende freigegeben werden. Ändern Sie das.

Sie können die Sperrgrenzen bisher nur aufdrehen. Es skaliert nicht auf beliebige Mengen von Lieferanten-IDs. Sie müssen die Ursache für die Sperren finden, nicht die Symptome mildern.

    
usr 14.02.2013 10:57
quelle
0

Es wird die maximale Anzahl der vom sql-Server erlaubten Sperren angezeigt - die standardmäßig automatisch festgelegt wird und vom verfügbaren Speicher bestimmt wird.

Sie können

  1. Stellen Sie es manuell ein - ich vergesse genau wie, aber Google ist dein Freund.
  2. Fügen Sie Ihrem sql-Server mehr Speicher hinzu
  3. Übernehmen Sie Ihre Transaktionen häufiger.
Matt Randle 14.02.2013 10:53
quelle