Stellen Sie sich diese Situation vor:
- Beginn der Transaktion
- Einfügen von 20 Datensätzen in eine Tabelle mit einem automatischen Erhöhungsschlüssel
- Holen Sie sich die erste Insert-ID (sagen wir, es ist
153
) - Aktualisieren Sie alle Datensätze in dieser Tabelle, bei denen
id >= 153
- Commit
Ist Schritt 4 sicher?
Das heißt, wenn eine andere Anforderung fast genau zur gleichen Zeit eingeht und weitere 20 Datensätze nach Schritt 2, aber vor Schritt 4 einfügt, liegt dann eine Race Condition vor?
0 Stimmen
Warum sollten Sie einen separaten Aktualisierungsschritt durchführen, anstatt die korrekten Daten von vornherein einzufügen? Das ist ziemlich seltsam. Sie bräuchten sich keine Sorgen um eine "Race Condition" zu machen, wenn Sie von Anfang an die richtigen Daten eingefügt hätten. Aktualisierung von
WHERE id > 153
ist auch eine sehr seltsame Anfrage. Auto increment ids haben keine Logik, und so sollten Sie nie (soweit ich weiß) nur auf der Grundlage von id aktualisieren. Und schließlich kenne ich keine "first insert id"-Funktion.0 Stimmen
@ButtleButkus dev.mysql.com/doc/refman/5.0/de/ "Wenn Sie mehrere Zeilen mit einer einzigen INSERT-Anweisung einfügen, gibt LAST_INSERT_ID() den für die erste eingefügte Zeile erzeugten Wert zurück.
0 Stimmen
Sie haben Recht mit LAST_INSERT_ID(), aber das ändert nichts an der Tatsache, dass sich die Frage auf eine hypothetische Situation zu beziehen scheint, die bei Einhaltung der grundlegenden Datenbankstruktur und -verfahren niemals eintreten würde. Warum sollte Ihr Aktualisierungskriterium jemals der Wert einer bedeutungslosen ID sein? Ich kann mir keinen Grund vorstellen. Ich würde das nicht als "Race Condition" bezeichnen, weil es unsinnig ist. Warum sollten Sie unmittelbar nach dem Einfügen aktualisieren, wenn Sie einfach die korrekten Werte einfügen könnten, um damit zu beginnen? Das sind die wahren Gründe, warum diese Frage keinen Sinn ergibt.
2 Stimmen
Ich kann mich nicht mehr an das ursprüngliche Problem erinnern (vor fast 3 Jahren), aber ich nehme an, dass es notwendig war :) Unabhängig von der Argumentation halte ich den Grundgedanken der Frage für legitim - könnten innerhalb dieser Transaktion Datensätze, die während einer dazwischenliegenden Einfügung eingefügt wurden, von einer Aktualisierung "gesehen" und beeinflusst werden?