Sind die Race Conditions wirklich von Bedeutung, wenn Sie zuerst eine Aktualisierung und dann eine Einfügung versuchen? Angenommen, Sie haben zwei Threads, die einen Wert für einen Schlüssel setzen wollen Schlüssel :
Thema 1: Wert = 1
Thema 2: Wert = 2
Beispiel für ein Race-Condition-Szenario
- Schlüssel ist nicht definiert
- Thread 1 schlägt beim Update fehl
- Thread 2 schlägt beim Update fehl
- Genau einer von Faden 1 oder Faden 2 hat Erfolg beim Einfügen. Z.B. Thread 1
-
Der andere Thread scheitert beim Einfügen (mit dem Fehler Duplikatschlüssel) - Thread 2.
- Ergebnis: Die "erste" der beiden einzufügenden Stufen, entscheidet über den Wert.
- Gesuchtes Ergebnis: Der letzte der 2 Threads, der Daten schreibt (Update oder Insert), soll den Wert bestimmen
In einer Multithreading-Umgebung entscheidet jedoch der Scheduler des Betriebssystems über die Reihenfolge der Thread-Ausführung - in dem obigen Szenario, in dem wir diese Wettlaufbedingung haben, war es das Betriebssystem, das über die Reihenfolge der Ausführung entschieden hat. D.h.: Es ist falsch zu sagen, dass "Thread 1" oder "Thread 2" aus Sicht des Systems "zuerst" ausgeführt wurde.
Wenn der Ausführungszeitpunkt für Thread 1 und Thread 2 so nah beieinander liegt, spielt das Ergebnis der Race Condition keine Rolle. Die einzige Anforderung sollte sein, dass einer der Threads den resultierenden Wert definiert.
Für die Umsetzung: Wenn eine Aktualisierung gefolgt von einer Einfügung den Fehler "doppelter Schlüssel" ergibt, sollte dies als Erfolg behandelt werden.
Außerdem sollte man natürlich nie davon ausgehen, dass der Wert in der Datenbank derselbe ist wie der, den man zuletzt geschrieben hat.
2 Stimmen
Ähnliche Fragen: * Stored Proc einfügen aktualisieren auf SQL Server * SQL Server 2005-Implementierung von MySQL REPLACE INTO?
53 Stimmen
Für alle, die diese Frage zum ersten Mal stellen - bitte lesen Sie unbedingt alle Antworten und Kommentare. Das Alter kann manchmal zu irreführenden Informationen führen...
1 Stimmen
Erwägen Sie die Verwendung des EXCEPT-Operators, der in SQL Server 2005 eingeführt wurde.