2012-08-31 33 views
1

我有以下代碼:PHP的mysqli多查詢+交易

... 
$mysqli->autocommit(FALSE); 

if(in_array('files',$item)){ 
      $sql_el_truncate = " 
       TRUNCATE TABLE `article_files`; 
       TRUNCATE TABLE `files`; 
       TRUNCATE TABLE `gallery_files`; 
       TRUNCATE TABLE `image_captions`; 
      "; 

      $mysqli->multi_query($sql_el_truncate); 

      do{ 
       $mysqli->use_result(); 
      }while ($mysqli->next_result()); 


      if ($mysqli->errno) { 
       $valid_entry = 0; 
      } 
      echo $valid_entry; 
     } 

if($valid_entry){ 
      $mysqli->commit(); 
     }else{ 
      $mysqli->rollback(); 
     } 

... 

上的錯誤,我得到的0適當$valid_entry價值,但回退不工作。即使我故意寫了一些TRUNCATE命令,它仍然會運行其餘的命令,給我錯誤但不會回滾。

任何人都知道如何正確使用mysqli上的交易?

回答

3

MySQL Reference ManualTRUNCATE TABLE(重點是我的):

從邏輯上講,truncate table要類似於DELETE語句 刪除所有行,或DROP TABLE的順序和CREATE TABLE語句 。爲了實現高性能,它繞過了刪除數據的DML方法 。因此,它不能回滾,它不會導致ON DELETE觸發器觸發,並且不能使用具有父子外鍵關係的InnoDB表 執行。

如果您希望能夠ROLLBACK您將不得不使用DELETE語句代替。他們在這裏效率較低,但應該給你想要的行爲。

+0

謝謝您的回答!現在你在暗示我做了什麼?保持它原樣,仍然得到一些截斷運行,因爲他們仍然運行或有一種替代方法? –

+0

更新了我的答案。 –