2016-04-18 5 views
2

In Codeigniter verwenden wirWird die letzte eingefügte ID aus der Datenbank abgerufen, besteht bei hohem Datenaufkommen Gefahr, dass die Daten vertauscht werden?

* (Method that inserts a new row in the DB) * 

Dann:

last_id = $this->db->insert_id(); 

die ID des in der DB "Leisten erstellt" Zeile abzurufen.

Was ist, wenn wir eine sehr hohe Zugriffszahlen auf die Anwendung haben, wird es versehentlich die ID von etwas erhalten, das von einem anderen Benutzer erstellt wurde?

Der Flow:

  1. eine Zeile in die
  2. DB Legen
  3. Führen Sie das insert_id-Methode, um die "letzte eingefügte ID"
  4. diese ID verwenden
  5. zu bekommen

Ist gibt es ein Risiko, dass ein anderer Benutzer möglicherweise eine neue Zeile zwischen Schritt 1 & # 2 erstellt hat?

Oder ist es "sofort" egal was der Verkehr ist?

Wenn nicht, wie können wir am besten ein Verwechseln von Zwischenschritten mit hohem Datenaufkommen verhindern?

Antwort

4

Nein, es ist kein Problem. Die letzte Einfüge-ID ist ein pro-Verbindung-Wert. Wenn ein anderer Benutzer eine Zeile erstellt, haben diese unterschiedliche Verbindungen, so dass die von der ersten Anwendung verwendete Verbindung nicht betroffen ist.

Vom documentation:

Die ID, die generiert wurde in dem Server auf einem pro Verbindung gehalten wird. Dies bedeutet, dass der von der Funktion an einen bestimmten Client zurückgegebene Wert der erste AUTO_INCREMENT-Wert ist, der für die letzte Anweisung generiert wurde, die eine AUTO_INCREMENT-Spalte dieses Clients betrifft. Dieser Wert kann von anderen Clients nicht beeinflusst werden, auch wenn sie eigene AUTO_INCREMENT-Werte generieren. Dieses Verhalten stellt sicher, dass jeder Client seine eigene ID abrufen kann, ohne sich um die Aktivität anderer Clients kümmern zu müssen, und ohne die Notwendigkeit von Sperren oder Transaktionen.

1

Nein, es besteht kein Risiko, es sei denn, Sie fügen eine andere Zeile mit derselben Verbindung ein.

Im Fall, dass Sie nur speichern Sie Ihre erste Einbringungs-ID in einer Variablen:

$last_id1 = $this->db->insert_id(); //Pretend its 10 
//...Another insertion here... 
$last_id2 = $this->db->insert_id(); //Pretend its 13 

Jetzt Ausgabe beiden Werte:

echo "ID1: $last_id1"; //Prints 'ID1: 10' 
echo "ID2: $last_id2"; //Prints 'ID2: 13' 

Nun werden Sie in der Lage sein, mit dem ersten arbeiten Wert in einem anderen Moment, auch wenn andere Zeilen eingefügt wurden

Verwandte Themen