8 Stimmen

SQL letzte Einfügung in Drupal. Ist es wirklich thread-sicher?

Ich habe eine Abfrage, die von mehreren Benutzern nacheinander ausgeführt werden kann. Ich befürchte, dass, wenn ich den Befehl db_last_insert_id ausführe, einige Benutzer aufgrund der Gleichzeitigkeit nicht die letzte Einfüge-Id erhalten könnten. Aber laut: http://api.drupal.org/api/function/db_last_insert_id/6 heißt es dort:

Gibt die letzte Einfügungs-ID zurück. Diese Funktion ist thread-sicher.

Meine Frage ist, wie sicher ist dieses Thema? Der Code ist nur:

<?php
  function db_last_insert_id($table, $field) {
   return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
  }
?> 

Ich sehe nichts über das Sperren von Tabellen oder ähnliches?

19voto

Pascal MARTIN Punkte 384469

MySQL verwenden (wie Sie mit den Tags in Ihrer Frage anzudeuten scheinen) die Funktion db_last_insert_id() ist folgendermaßen definiert:

function db_last_insert_id($table, $field) {
  return db_result(db_query('SELECT LAST_INSERT_ID()'));
}

in database.mysql-common.inc

Und LAST_INSERT_ID() hängt von der Verbindung ab (zitiert, Hervorhebung von mir) :

Die erzeugte ID lautet im Server auf einer pro Verbindung verwaltet. Das bedeutet, dass der Wert, der von der Funktion an einem bestimmten Client zurückgegeben wird, der erste AUTO_INCREMENT Wert erzeugt für letzte Anweisung, die sich auf eine AUTO_INCREMENT-Spalte durch diesen Client. Dieser Wert kann von anderen Clients nicht beeinflußt werden Clients beeinflusst werden, selbst wenn diese AUTO_INCREMENT ihre eigenen Werte. Dieses Verhalten stellt sicher, dass jeder Client kann seine eigene ID abrufen, ohne ohne Rücksicht auf die Aktivitäten der anderen Clients und ohne die Notwendigkeit von Sperren oder Transaktionen.

Ich würde also sagen, dass dies für MySQL ganz OK ist ;-)

Die von Ihnen gepostete Definition ist diejenige, die für PostGreSQL verwendet wird:

function db_last_insert_id($table, $field) {
  return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')"));
}

Unter database.pgsql.inc

Von pgsql-Handbuch über Sequenzen (Zitat; Hervorhebung von mir) :

currval

Rückgabe des letzten Wertes durch nextval für diese Sequenz erhalten wurde in der aktuellen Sitzung . (Ein Fehler wird gemeldet, wenn nextval noch nie für diese Sequenz in dieser Sitzung aufgerufen wurde.) Beachten Sie, dass, da es sich um einen session-lokalen Wert zurückgibt, es gibt eine vorhersehbare Antwort, unabhängig davon keine anderen Sitzungen ausgeführt haben nextval ausgeführt haben, seit die aktuelle Sitzung .

Ich nehme also an, dass dies auch für PostGreSQL in Ordnung ist.

1 Stimmen

Ich danke Ihnen. Ich wünschte, ich könnte Ihnen zehn UPS geben.

2 Stimmen

Gern geschehen :-) huhu ^^ du musst noch 10 andere Fragen stellen, auf die ich die Antwort weiß :-D

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X