Ich habe die folgende SQL:Ist dieses SQL-Update garantiert atomar?
UPDATE Customer SET Count=1 WHERE ID=1 AND Count=0
SELECT @@ROWCOUNT
Ich muss wissen, ob dies gewährleistet ist atomar zu sein.
Wenn 2 Benutzer gleichzeitig versuchen, wird nur einer erfolgreich sein und einen Rückgabewert von 1 erhalten? Muss ich eine Transaktion oder etwas anderes verwenden, um dies zu garantieren?
Ziel ist es, einen eindeutigen "Count" für den Kunden zu erhalten. Kollisionen in diesem System werden so gut wie nie vorkommen, daher mache ich mir keine Gedanken über die Performance, wenn ein Benutzer erneut (und wieder) abfragen muss, um eine eindeutige Zählung zu erhalten.
EDIT:
Das Ziel ist nicht, eine Transaktion zu verwenden, wenn es nicht benötigt wird. Auch diese Logik wird sehr selten ausgeführt (bis zu 100 pro Tag), also wollte ich es so einfach wie möglich halten.
Ich denke, Sie haben diese SQL zu sehr vereinfacht, um mit Ihrem letzten Absatz zu entsprechen. Was ist der Zweck, einen einzigartigen "Count" zu haben? Soll es nur einen Wert von 0 oder 1 haben? –
Es erhält eine eindeutige Nummer für jede Bestellung vom Kunden. Dies ist die Referenznummer des Benutzers für die Bestellung, also beginnt jeder Kunde bei 0 für die erste Bestellung und 1 für die zweite Bestellung, dann 2 usw. – David
Mögliches Duplikat von [Vermeidung von Nebenläufigkeitsproblemen mit MAX + 1 Ganzzahl in SQL Server 2008 ... eigenen IDENTITY-Wert machen] (http://stackoverflow.com/questions/8956044/avoiding-concurrency-problems-with-max1-integer-in-sql-server-2008-making-ow) –