2017-06-02 30 views
2

我試圖與MySQL數據庫(InnoDB的),但回退不工作PHP測試交易...

這是我的代碼

<?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); 
?> 

有哪裏不對了? (我也嘗試在PHP的面向對象的風格,從here參考)

SHOW CREATE TABLE人查詢結果

+0

我認爲它與'if($ conn-> affected_rows'之後的提交有關。如示例[here]中所示(http://php.net/manual/en/mysqli.commit.php#refsect1-mysqli .commit-examples)在調用commit之前執行了多個查詢,並且autocommit從未重置爲true – Jelmergu

+0

您能否確切地確認發生了什麼?更新?還是隻有一個?您不應該將過程與面向對象的樣式混合,只需選擇一個。 – mickmackusa

+0

如果第二次查詢的執行則失敗的第一次提交應根據else塊被回滾,但它不工作,承諾不會回退 –

回答

0

你犯的第一個更新的第二更新已完成之前,所以......

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

好吧,這有利於實現我的需要,但即使我刪除了其他塊,然後這有什麼區別,因爲如果我不提交任何東西,那麼回滾的需要是什麼? –

+0

回滾後,回到上次提交後的情況。事實上,如果回滾是你的最後一個命令,那麼它就沒有必要,但是如果你在其後面有其他查詢,它可能是有用的。 –

+0

我發現它有用做一些具體而不是事物暗示。畢竟 - 這是一個代碼行,如果別人改變你的代碼,並添加更多的SQL假設自動提交 - 它引起的種種問題 - 你可能會被指責爲: -/ –