So lösen Sie den Parallelitätskonflikt in ado.net

8

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

%Vor%

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%     
JeffZhnn 24.08.2012, 02:45
quelle

2 Antworten

4

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):

%Vor%     
Marc Gravell 27.08.2012 15:17
quelle
1

Ziehen Sie in umgekehrter Reihenfolge vor, und es wird wahrscheinlich viel einfacher sein. Zum Beispiel:

  • Erstellen Sie eine Tabelle mit einem automatisch inkrementierenden Index. Nennen Sie es "Up" oder "RequestOrdering" oder was auch immer.
  • Erhalten Sie Clientanfragen in beliebiger Reihenfolge. Für jede Anfrage:
    • Fügen Sie eine neue Zeile in Up ein.
    • Erhalte die letzte eingefügte Zeilen-ID.
    • Wenn die letzte Einfügung ID & lt; = 20, führe eine echte Einfügung durch.
  • Wirf deinen Up-Tisch weg, wenn du damit fertig bist.

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%     
EthanB 30.08.2012 22:10
quelle

Tags und Links