Ich habe eine Abfrage, die nacheinander von mehreren Benutzern ausgeführt werden kann. Ich habe Angst, dass, wenn ich den Befehl db_last_insert_id ausführe, einige Benutzer die letzte Einfüge-ID aufgrund von Parallelität nicht erhalten. Aber gemäß: Ссылка , heißt es:
Gibt die letzte Einfüge-ID zurück. Diese Funktion ist threadsicher.
Meine Frage ist, wie ist dieser Thread sicher? Der Code ist nur:
%Vor%Ich sehe nichts über Schließtische oder nichts?
Unter Verwendung von MySQL (wie Sie mit den Tags auf Ihre Frage zu zeigen scheinen) ist die Funktion db_last_insert_id()
ist folgendermaßen definiert:
in database.mysql-common.inc
Und LAST_INSERT_ID()
hängt von der Verbindung (Zitat, Hervorhebung von mir) :
Die ID, die generiert wurde, ist im Server auf einem pro Verbindung. Das bedeutet, dass der Wert, der von der Funktion an zurückgegeben wird Ein bestimmter Kunde ist der erste
AUTO_INCREMENT
Wert generiert für neueste Anweisung, die sich auf eine AUTO_INCREMENT-Spalte von diesem Client. Dieser Wert kann nicht von anderen beeinflusst werden Kunden, auch wenn sie generierenAUTO_INCREMENT
eigene Werte. Dieses Verhalten stellt sicher, dass jeder Client kann seine eigene ID ohne abrufen Sorge um die Aktivität anderer Kunden und ohne Notwendigkeit Sperren oder Transaktionen.
Also würde ich sagen, dass das für MySQL recht OK ist ;-)
Die von Ihnen gepostete Definition ist die für PostGreSQL verwendete Definition:
In database.pgsql.inc
Von pgsql Handbuch zu Sequenzen (Zitat; Hervorhebung von mir) :
currval
Geben Sie den Wert zuletzt zurück von nextval für diese Sequenz erhalten in der aktuellen Sitzung . (Ein Fehler ist gemeldet, wenn nextval noch nie war forderte diese Sequenz in diesem Sitzung.) Beachten Sie, dass dies so ist Rückgabe eines sitzungslokalen Wertes, it gibt eine vorhersehbare Antwort, ob oder andere Sitzungen haben nicht ausgeführt nextval seit der aktuellen Sitzung .
Also, ich schätze, das ist auch für PostGreSQL ganz in Ordnung.
Tags und Links multithreading mysql concurrency drupal