Mysql
 sql >> Datenbank >  >> RDS >> Mysql

LastInsertId von PDO für MySQL eine Racebedingung?

MySQL gibt die letzte Insert-ID einer Sitzung nicht an eine andere Sitzung zurück.

http://dev.mysql .com/doc/refman/5.6/en/information-functions.html#function_last-insert-id sagt:

Zu Ihren Kommentaren:

Dies war von Anfang an das Verhalten von MySQL. Das Zurückgeben der letzten Insert-ID wäre ziemlich nutzlos, wenn sie anfällig für eine Race-Condition wäre, das heißt, wenn Inserts in anderen Sitzungen Ihre Sitzung verschmutzen könnten.

Eine Möglichkeit besteht darin, dass Sie dauerhafte Verbindungen verwenden, weil alte PHP-Versionen einen Fehler hatten, dass einer neuen PHP-Anfrage eine Verbindung gegeben werden konnte und Zugriff auf den sitzungsbezogenen Zustand einer früheren PHP-Anfrage gewährt wurde. Mit anderen Worten, Dinge wie Sperren und Transaktionen und temporäre Tabellen und Benutzervariablen und die letzte Einfüge-ID könnten eine nachfolgende PHP-Anforderung überleben. Diese Probleme sollten in PHP 5.3 mit dem mysqlnd-Treiber behoben werden; eine dauerhafte Verbindung sollte auf einen Anfangszustand "zurückgesetzt" werden.

Eine andere mögliche Erklärung ist, dass es wirklich richtig funktioniert und Sie sich in Ihren Beobachtungen irren. Daher würde ich vorschlagen, es sorgfältig und methodisch zu testen.

Aktualisierung: gemäß Ihrer Antwort , hatte dieses Problem nichts mit MySQL oder PDO oder lastInsertId zu tun. Es hört sich so an, als hätten Sie überhaupt keine Diskrepanzen in der Ausgabe Ihres PHP-Codes gesehen, sondern unerwartete Zahlen in den Netzwerkleistungsstatistiken in Chrome Dev Tools.