Diese Frage gilt sicherlich für einen viel breiteren Bereich, aber hier ist es.Richtiger Weg zum Erstellen von Bestellnummern in SQL Server
Ich habe eine grundlegende E-Commerce-App, wo Benutzer natürlich Bestellungen aufgeben können. Diese Befehle müssen eine eindeutige Nummer haben, die ich gerade erzeugen möchte.
Jede Bestellung ist herstellerspezifisch. Grundsätzlich habe ich eine OrderNumberInfo (VendorID, OrderNumber)
Tabelle. Jetzt, wenn ein Kunde eine Bestellung aufgibt, muss ich OrderNumber
für einen bestimmten Verkäufer erhöhen und diesen Wert zurückgeben. Natürlich, ich will nicht andere Prozesse mit mir stören, so muss ich nur diese Zeile sperren irgendwie:
begin tranaction
declare @n int
select @n = OrderNumber
from OrderNumberInfo
where VendorID = @vendorID
update OrderNumberInfo
set OrderNumber = @n + 1
where OrderNumber = @n and VendorID = @vendorID
commit transaction
Jetzt habe ich über select ... with (updlock rowlock)
, pessimistische Sperren lesen usw., sondern kann einfach nicht passen All dies in einem kohärenten Bild:
- Wie spielen diese Hinweise mit Snapshot-Isolation von SQL Server 2008?
- Führen sie Sperren auf Zeilen-, Seiten- oder sogar Tabellenebene aus?
- Wie toleriert dies mehrere Benutzer, die versuchen, Zahlen für einen einzelnen Anbieter zu generieren?
- Welche Isolationsstufen sind hier geeignet?
- Und in der Regel - was ist der Weg, solche Dinge zu tun?
EDIT
Nur wenige Dinge klarer zu machen:
- Leistung in dieser besonderen Ecke der App ist absolut kein Problem: Aufträge relativ selten gestellt werden und wird ein verwickeln teurer Aufruf an den Web-Service der Anbieter, so ist 1-Sekunden-Verzögerung ziemlich tolerabel
- Wir wirklich müssen die Bestellnummern jedes Lieferanten zu b haben e unabhängig und sequentiell
Das ist interessant! Vielen Dank! –
Wenn die OrderNumber-Spalte die zuletzt verwendete OrderNumber darstellt, möchten Sie dann nicht "Insert.OrderNumber" verwenden? – Thomas
@Thomas: Ich imitiert nur das Verhalten des Codes in der Frage, die zuerst die Bestellnummer erhält und dann die Spalte erhöht. Aber wenn Sie inkrementieren möchten und dann die inkrementierte Bestellnummer bekommen, dann wäre 'INSERTED.OrderNumber' der richtige Weg. – LukeH