Ich habe einen Endpunkt (ASP.NET WebAPI + Entity Framework 6), der das Hinzufügen von Elementen zu einem Warenkorb ermöglicht. Es sieht wie folgt aus:Basket Item mit mit TransactionScope.ReadCommitted immer noch Duplikate erstellen
public int AddToBasket(BasketUpdate update) { var transactionOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }; using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) { var existingBasketItem = basketItems.Query().FirstOrDefault(item => item.UserId == update.UserId && item.AccountId == update.AccountId && item.ProductId == update.ProductId);
existingBasketItem = existingBasketItem ?? basketItems.Create();
existingBasketItem.Quantity += update.Quantity;
existingBasketItem.AccountId = update.AccountId;
existingBasketItem.UserId = update.UserId;
existingBasketItem.ProductId = update.ProductId;
unitOfWork.Commit();
scope.Complete();
return existingBasketItem.Quantity;
}
}
So nahm ich (in meiner endlosen Krippe), wenn ich mehrere Anrufe auf diesen Endpunkt Feuer, ich mit einem Eintrag immer am Ende in der Datenbank Aufsummierung die Mengen aller Anrufe korrekt. Das Durchdringen dieses Endpunkts mit Fiddler scheint zu bestätigen, dass alle Anforderungen warten, bis der vorherige abgeschlossen ist.
aber sobald ich aufhören, (oder jemand anderer Artikel fügt den Korb), ich am Ende so etwas mit:
Id Quantity ProductId UserId AccountId
429 12 4560 56 2234
430 1 4560 56 2234
Wie auf der Erde vorkommen, dass kann? Gibt es zufällig irgendwann zwei Instanzen auf dem IIS-Server oder missverstehe ich etwas über Transaktionen hier? Zieht mir schon die Haare, so würde Hilfe sehr geschätzt werden.