Christian Kruse: SQL Update bei vielen Anwendern

Beitrag lesen

Hallo WernerK,

Ein PHP Script (IIS) macht in einer MS SQL Tabelle einen Udate auf eine Spalte. Hier steht nur eine Zahl drin, die um 1 erhöht wird. Die Zahl wird später für eine Auftragsnummer verwendet.

Klingt nach einem Fall für Sequences.

Besteht die Gefahr, dass bei vielen Anwendern die event. zeitgleich das Script aufrufen doppelte Nummern zurckgeliefert werden?

Wenn du ein UPDATE machst, wird die Tabelle bei MSSQL exklusiv gesperrt. Bist du sicher, dass du nur ein UPDATE machst? Oder ist das eher ein SELECT mit einem folgenden UPDATE?

Also z.b. User A macht Update und bekommt eine 3 zurück. Zeitgleich macht auch User B ein Update und bekommt auch eine 3? Oder handelt das der SQL Server das selber so aus, dass die Tabelle gesperrt ist und nichts passieren kann?

Ein UPDATE-Statement löst einen exklusiven Lock aus, es können nicht zwei Prozesse gleichzeitig die gleiche Zeile ändern. Da aber nicht ganz klar ist, was genau du tust, kann ich dir keine erschöpfende Antwort geben. Wenn du etwa erst ein SELECT und danach ein UPDATE machst, dann bist du anfällig für race conditions, ja. Wenn du ein UPDATE mit einem festen Wert machst und nicht nach dem Schema UPDATE foo SET col = col + 1, dann bist du auch anfällig für race coditions. Wenn du ein UPDATE foo SET col = col + 1 OUTPUT inserted.col machst, bist du safe.

Was genau machst du? 😉

(Ich kann in diesem speziellen Fall nicht mit Transaktionen arbeiten)

MSSQL verwendet immer Transaktionen…

LG,
CK