Solch ein Szenario: eine bestimmte Menge von Daten in eine Tabelle eingefügt werden, wenn ein Schwellenwert nicht mehr einfügen erreicht, habe ich dieses Szenario simuliert, im Fall von Multi-Threaded (zB asp.net) erschien gleichzeitige Probleme / p>
Meine Frage ist, wie das gleichzeitige Problem zu lösen ist, verwenden Sie nicht die lock
case
Methode eins - Nebenläufigkeit sehr ernst
%Vor%Methode zwei - setzen Sie die sql zusammen reduzieren kann gleichzeitig, aber immer noch existieren
%Vor%Methode drei - mit Sperre zerstören die gleichzeitige, aber ich glaube nicht, dass es eine beste Lösung ist
%Vor%andere Hilfemethode
%Vor%Es scheint, dass Sie nur in Down einfügen möchten, wenn weniger als 20 Zeilen vorhanden sind. Wenn ja, führe eine einzige Operation aus:
%Vor% Alternativ, wenn Sie * brauchen *, müssen Sie eine Transaktion verwenden, idealerweise "Serializable", so dass Sie eine Schlüsselbereichssperre erhalten - vielleicht sogar (UPDLOCK)
zur Initiale hinzufügen zählen, um sicherzustellen, dass es eine eifrige Schreibsperre (oder Blöcke, anstatt Deadlocks) dauert. Aber: die einzelne TSQL-Operation (wie bereits gezeigt, ist vorzuziehen. Sie könnten das sogar paranoider machen (obwohl ich nicht sicher bin, ob sie es braucht):
Ziehen Sie in umgekehrter Reihenfolge vor, und es wird wahrscheinlich viel einfacher sein. Zum Beispiel:
Wenn Ihre Datenbank mehrspaltige Primärschlüssel unterstützt, von denen einer automatisch inkrementiert (IIRC, MyISAM-Tabellen), können Sie die "Up" -Tabelle für mehrere Produktspecials wiederverwenden.
Eine noch einfachere Implementierung wäre 20 Zeilen in "Down" einzufügen und eine pro Anfrage zu löschen. Überprüfen Sie die Anzahl der betroffenen Zeilen (sollte 1 sein), um festzustellen, ob der Benutzer erfolgreich war. Dies spielt gut mit Multi-Produkt-Specials. Zum Beispiel:
%Vor%Wahrscheinlich am einfachsten, und um auch zu verfolgen, wer "gewonnen" hat, erstellen Sie eine Zeile pro Produkt und lassen Sie jeden Benutzer eine (und nur eine) Zeile aktualisieren. Überprüfen Sie erneut die Anzahl der betroffenen Zeilen, um festzustellen, ob sie erfolgreich waren:
%Vor%Tags und Links c# asp.net concurrency ado.net