2010-07-25 2 views
2

J'essaie de configurer une transaction MySQL de sorte que je puisse faire défiler plusieurs requêtes (voir ci-dessous) et si l'une d'entre elles échoue, annuler toutes les modifications. Je constate cependant que si l'un échoue, toutes les requêtes ne sont pas annulées. Est-ce que je fais quelque chose de mal ici?Problème lors de l'utilisation de transactions MySQL avec des boucles en PHP

mysql_query("START TRANSACTION"); 

    foreach($array1 as $arr){ 

      // loop SQL query 

      if(mysql_error()){ 
       $failed = "..."; 
      } 
    } 


    foreach($array2 as $arr){ 

      // loop SQL query 

      if(mysql_error()){ 
       $failed = "..."; 
      } 
    } 

    if(isset($failed)){ 
      mysql_query("ROLLBACK"); 
    } else { 
      mysql_query("COMMIT"); 
    } 

Merci!

Répondre

3

La raison est que si une requête échoue (en raison d'une erreur), la transaction est automatiquement annulée et terminée. Donc, vous devriez arrêter de faire une boucle si une requête échoue, car tout ce qui s'exécute après l'échec de la requête sera autocommit (Ou au moins être dans une autre transaction si AUTOCOMMIT est désactivé) ...

1

Utilisez-vous un type de table sûr pour les transactions? Le défaut MyISAM ne supporte pas les transactions, je recommande d'utiliser InnoDB.

Questions connexes