Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment fonctionne l'obtention du dernier ID d'insertion de mysql avec les transactions ? + questions sur les transactions

Pour répondre à votre première question...

Lors de l'utilisation de transactions, vos requêtes sont exécutées normalement en ce qui concerne votre connexion. Vous pouvez choisir de valider, en enregistrant ces modifications, ou de revenir en arrière, en annulant toutes les modifications. Considérez le pseudo-code suivant :

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.

Le nombre aléatoire qui a été généré peut être lu avant la validation pour s'assurer qu'il convient avant de l'enregistrer pour que tout le monde puisse le voir (par exemple, valider et déverrouiller la ligne).

Si le pilote PDO ne fonctionne pas, envisagez d'utiliser le pilote mysqli. Si ce n'est pas une option, vous pouvez toujours utiliser la requête 'select last_insert_id() as id;' plutôt que la fonction $this->db->insert_id().

Pour répondre à votre deuxième question, si vous insérez ou mettez à jour des données que d'autres modèles mettront à jour ou liront, assurez-vous d'utiliser des transactions. Par exemple, si une colonne 'Number_remaining' est définie sur 1, le problème suivant peut se produire.

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

L'utilisation de transactions dans la même situation donnerait ce résultat :

Vous voudrez peut-être lire les niveaux d'isolement des transactions aussi.

Attention au deadlock, qui peut survenir dans ce cas :

À la fin, puisque la personne B a probablement atteint le max_execution_time de PHP , la requête en cours finira de s'exécuter indépendamment de PHP, mais aucune autre requête ne sera reçue. S'il s'agissait d'une transaction avec autocommit=0, la requête sera automatiquement annulée lorsque la connexion à votre serveur PHP sera interrompue.