2017-06-02 1 views
2

Je suis en train de tester la transaction en php avec base de données MySQL (InnoDB) mais le rollback ne fonctionne pas ...

Ceci est mon code

<?php 
    $servername = "localhost"; 
    $username = "root"; 
    $password = ""; 
    $database = "test"; 

    $conn = mysqli_connect($servername, $username, $password, $database); 

    mysqli_autocommit($conn, FALSE);  

    mysqli_query($conn,"update person set Balance = 300 where Name = 'Jay'"); 
    if ($conn->affected_rows > 0) { 
     mysqli_commit($conn); 
     echo "First Commited <br>"; 
     mysqli_query($conn,"update person set Balance = 3000 where Name = 'Rv'");  
     if($conn->affected_rows > 0) { 
      mysqli_commit($conn); 
      echo "Second Commited <br>"; 
     }else { 
      mysqli_rollback($conn); 
      echo "First rollback <br>"; 
     }  
    } 
    mysqli_close($conn); 
?> 

est-il quelque chose de mal? (Je aussi essayer le style orienté objet en php, reportez-vous à partir here)

résultat SHOW CREATE TABLE personne de requête

+0

Je pense que cela a à voir avec le commit après 'if ($ conn-> affected_rows'. Comme vu dans un exemple [ici] (http://php.net/manual/en/mysqli.commit.php#refsect1-mysqli .commit-examples) il y a plusieurs requêtes exécutées avant d'appeler commit, et autocommit n'a jamais été réinitialisé à – Jelmergu

+0

Pouvez-vous confirmer exactement ce qui se passe? mises à jour? ou juste un? Vous ne devez pas mélanger les procédures avec les styles orientés objet, en choisir un. – mickmackusa

+0

Si l'exécution de la deuxième requête a échoué, la première validation devrait être annulée selon le bloc else mais cela ne fonctionne pas, commit ne rollback pas –

Répondre

0

Votre commettre la première mise à jour avant la deuxième mise à jour a été fait, alors ...

mysqli_autocommit($conn, FALSE);  

    mysqli_query($conn,"update person set Balance = 300 where Name = 'Jay'"); 
    if ($conn->affected_rows > 0) { 
     // mysqli_commit($conn); // Remove this line 
     // echo "First Commited <br>"; 
     mysqli_query($conn,"update person set Balance = 3000 where Name = 'Rv'");  
     if($conn->affected_rows > 0) { 
      mysqli_commit($conn); 
      echo "Second Commited <br>"; 
     }else { 
      mysqli_rollback($conn); 
      echo "First rollback <br>"; 
     }  
    } 
+0

D'accord, cela est utile pour atteindre mon besoin, mais, même si j'ai supprimé le bloc else, cela fait-il une différence, parce que si je ne suis pas commettre quoi que ce soit alors quel est le besoin de retour en arrière! –

+0

Après la restauration, vous revenez à la situation après la dernière validation. En effet, si rollback est votre dernière commande, elle n'en a pas besoin, mais si vous avez d'autres requêtes après, cela peut être utile. –

+0

Je trouve utile de faire quelque chose spécifiquement plutôt que des choses sont impliquées. Après tout - c'est une ligne de code et si d'autres modifient votre code et ajoutent plus de SQL en supposant que la validation automatique est activée - cela provoque toutes sortes de problèmes - dont vous serez probablement blâmés: -/ –