Ich habe einen Webservice, der fast gleichzeitig mehrere Anfragen erhält.Deadlock in Entity Framework
Wenn dies passiert, die Transaktionen der beiden Anforderungen Deadlock und ich muss eine erneute Ausführung von ihnen Rollback.
using (var context = new DbContext())
using (var dbContextTransaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
{
var subscription = context.Subscriptions.FirstOrDefault(x => x.Provider == provider);
if (subscription == null)
{
*/Insert*/
}
else
{
/*Update*/
}
context.SaveInTransaction(null);
dbContextTransaction.Commit();
}
Wie ich beide Anfragen verstehe, geben Sie die Transaktion ein und lesen Sie die Abonnements-Tabelle. Zu dem Zeitpunkt, zu dem sie bereit sind, zu committen, sind sie deadlocked, da sie Werte in einem Datenbereich nicht einfügen können, der von einer anderen Transaktion (IsolationLevel.Serializable) gelesen wird.
Wenn ich TransactionLevel nicht serialisieren kann, erfüllt eine der Anforderungen die Unique-Einschränkungen der Provider-Spalte nicht und wird zurückgesetzt.
Was soll ich tun, um Deadlocks zu verhindern?
Sie können mit einem 'Lock' https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/ keywords/lock-statement – Hackerman
Entweder fangen Sie eine Exception, die eine eindeutige Verletzung anzeigt, und versuchen Sie es erneut, oder verwenden Sie raw sql, um "upsert" in einer atomaren Operation auszuführen (in sql server ist die entsprechende Operation MERGE). Mir sind keine anderen Möglichkeiten bekannt, dies in EF zu handhaben. – Evk