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

Wie funktioniert das Abrufen der letzten Insert-ID von mysql mit Transaktionen? + Transaktionsfragen

Um Ihre erste Frage zu beantworten...

Bei der Verwendung von Transaktionen werden Ihre Abfragen, soweit es Ihre Verbindung betrifft, normal ausgeführt. Sie können festlegen, ob Sie diese Änderungen speichern oder zurücksetzen möchten, indem Sie alle Änderungen rückgängig machen. Betrachten Sie den folgenden Pseudocode:

insert into number(Random_number) values (rand()); 
select Random_number from number where Number_id=Last_insert_id();

//php

if($num < 1)
   $this->db->query('rollback;'); // This number is too depressing.
else
   $this->db->query('commit;'); // This number is just right.

Die generierte Zufallszahl kann vor dem Festschreiben gelesen werden, um sicherzustellen, dass sie geeignet ist, bevor sie für alle sichtbar gespeichert wird (z. B. Festschreiben und Entsperren der Zeile).

Wenn der PDO-Treiber nicht funktioniert, ziehen Sie die Verwendung des mysqli-Treibers in Betracht. Wenn dies nicht möglich ist, können Sie immer die Abfrage „select last_insert_id() as id;“ verwenden. anstelle der Funktion $this->db->insert_id().

Um Ihre zweite Frage zu beantworten:Wenn Sie Daten einfügen oder aktualisieren, die andere Modelle aktualisieren oder lesen, verwenden Sie unbedingt Transaktionen. Wenn zum Beispiel eine Spalte „Number_remaining“ auf 1 gesetzt ist, kann das folgende Problem auftreten.

Person A reads 1
Person B reads 1
Person A wins $1000!
Person A updates 1 to be 0
Person B wins $1000!
Person B updates 0 to be 0

Die Verwendung von Transaktionen in der gleichen Situation würde zu diesem Ergebnis führen:

Vielleicht möchten Sie sich über Transaktionsisolationsstufen auch.

Achten Sie auf Deadlocks, die in diesem Fall auftreten können:

Am Ende, da Person B wahrscheinlich die max_execution_time von PHP erreicht hat , wird die aktuelle Abfrage unabhängig von PHP ausgeführt, es werden jedoch keine weiteren Abfragen empfangen. Wenn dies eine Transaktion mit autocommit=0 war, wird die Abfrage automatisch zurückgesetzt, wenn die Verbindung zu Ihrem PHP-Server getrennt wird.