Ich habe eine Tabelle namens tblOrderNumber, die 1 Zeile und 1 Spalte hat. In dieser Tabelle wird die nächste Bestellnummer für meine E-Commerce-Website gespeichert. Es ist ABSOLUT VITAL, dass dieselbe Bestellnummer nicht mehr als einmal verwendet wird. Derzeit verwendet das Team diese gespeicherte Prozedur und es scheint gut zu funktionieren:
Meine Frage ist, garantiert UPDLOCK dies? Ich hätte gedacht, dass auch für SELECT eine Lesesperre erforderlich ist (in dem unwahrscheinlichen Fall, dass 2 Bestellungen innerhalb einer Millisekunde voneinander platziert werden und die erste das UPDATE nicht durchgeführt hat, bevor die zweite, wie ich verstehe, eine SELECT durchgeführt hat In diesem Verfahren gibt es keine Lesesperre.
DECLARE @NextOrderNumber INT
BEGIN TRANSACTION
SELECT @NextOrderNumber = NextOrderNumber
FROM tblOrderNumber (UPDLOCK)
UPDATE tblOrderNumber
SET NextOrderNumber = NextOrderNumber + 1
COMMIT
SELECT @NextOrderNumber
--Kundenimplementierung (Wäre UPDLOCK ODER SERIALIZABLE hier besser, da ich nicht denke, dass wir die vollständige Tabelle sperren müssen?)
UPDATE dbo.tblOrderNumber WITH (SERIALIZABLE) SET @NextOrderNumber = NextOrderNumber, NextOrderNumber = NextOrderNumber + 1; WHERE CustomerId=@CustomerId
Ich verwende SQL Server 2014, werde aber bald zu SQL Azure wechseln.