SQL zuletzt einfügen in Drupal. Ist es wirklich threadsafe?

8

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?

    
coderama 11.09.2009, 10:51
quelle

1 Antwort

19

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:

%Vor%

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 generieren    AUTO_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:

%Vor%

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.

    
Pascal MARTIN 11.09.2009, 10:58
quelle