Christian Kruse: SQL Update bei vielen Anwendern

Beitrag lesen

Hallo WernerK,

also es ist tatsächlich so, das ich zuerste einen Select mache um eine Nummer zu holen. Ich Prinzip vereinfacht so:

SELECT nummer FROM TableX
$auftragno = $row['numer'];
if($auftragno == ""){
  $auftragno = 1;
  INSERT INTO tableX nummer ($auftragno)
..
)
}else{
  $auftragno = $auftragno + 1;
  $sql_update = "
                UPDATE TableX
                SET nummer = '".$auftragno ."'WHERE CODE = '".$code."'
            ";
}

Ja, der Code ist anfällig für race conditions.

Also wenn ich euch richtig verstanden habe, dann besteht hier doch die Gefahr, dass es Duppletten geben kann.

Sofern du nicht mit einem Unique Constraint arbeitest (und das solltest du, wenn du einen eindeutigen Datensatz haben möchtest), dann ja.

Nicht wegen dem Update an sich, sondern wegen dem Zeitpunkt des Selects?

Jein. Weil zwischen SELECT und UPDATE/INSERT beliebige andere Operationen passieren können. Zwei Prozesse machen gleichzeitig ein SELECT und führen dann die gleiche Operation aus. Damit würde Prozess 1 das Ergebnis von Prozess 2 überschreiben.

Dann muss ich vermutlich doch wie ursprünglich angedacht, mit SQL Sequenzen arbeiten.

Klingt nach der besseren Lösung, ja. Und klingt auch zusätzlich noch nach einem unique constraint.

LG,
CK