2017-06-02 8 views
2

Ich versuche Transaktion in PHP mit MySQL-Datenbank (InnoDB) zu testen, aber das Rollback nicht funktioniert ...

Dies ist mein 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); 
?> 

Gibt es etwas falsch? (Ich habe auch objektorientiert in PHP versuchen, Nachnahme here)

SHOW CREATE TABLE Person Abfrageergebnis

+0

Ich denke, es hat mit dem Commit nach 'if ($ conn-> affected_rows 'zu tun. Wie in einem Beispiel [hier] (http://php.net/manual/en/mysqli.commit.php#refsect1-mysqli commit-examples) Es werden mehrere Abfragen ausgeführt, bevor Commit aufgerufen wird, und autocommit wird nie auf true zurückgesetzt – Jelmergu

+0

Können Sie genau bestätigen, was passiert? Aktualisierung? oder nur einer? Sie sollten prozedurale mit objektorientierten Stilen nicht mischen, wählen Sie einfach einen aus. – mickmackusa

+0

Wenn die Ausführung der zweiten Abfrage fehlgeschlagen ist, sollte der erste Commit nach dem else Block zurückgesetzt werden, aber es funktioniert nicht, commit wird nicht zurückgesetzt –

Antwort

0

Sie begeht das erste Update, bevor das zweite Update getan worden ist, so ...

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

Okay, das ist hilfreich, um meine Notwendigkeit zu erreichen, aber selbst wenn ich den Else-Block entfernt habe, dann macht es einen Unterschied, denn wenn ich es nicht bin alles zu tun, was dann Rollback nötig ist! –

+0

Nach dem Rollback kehren Sie zu der Situation nach dem letzten Commit zurück. In der Tat, wenn Rollback Ihr letzter Befehl ist, hat es keine Notwendigkeit, aber wenn Sie andere Abfragen danach haben, kann es nützlich sein. –

+0

Ich finde es nützlich, etwas speziell zu tun, anstatt Dinge impliziert werden. Schließlich - es ist eine Zeile Code und wenn andere Ihren Code ändern und fügen Sie mehr SQL unter der Annahme, dass Autocommit ist - es verursacht alle Arten von Problemen - die Sie wahrscheinlich verantwortlich gemacht werden: -/ –

Verwandte Themen