2016-10-03 11 views
1

2つのテーブルにデータを挿入するループがあります。ループの最初の反復では挿入は成功しますが、2回目の反復では挿入は失敗します。MySQLトランザクション、ロールバックが機能しません。(PHP PDO)

私はスクリプトを作成して、いずれかの反復が失敗した場合、トランザクション全体をロールバックする必要があります。ただし、これは機能しません。

最初の反復は、(それが成功した)

<?php 
    include('model/dbcon.model.php'); 

    $languages = array('project_nl', 'project_en'); 

    DBCon::getCon()->beginTransaction(); 

    $rollback = true; 

    foreach($languages as $language) { 
     $Q = DBCon::getCon()->prepare('INSERT INTO `'.$language.'`(`id`, `name`, `description`, `big_image`) VALUES (:id,:name,:description,:big_image)'); 
     $Q->bindValue(':id', '1', PDO::PARAM_INT); 
     $Q->bindValue(':name', 'test', PDO::PARAM_INT); 
     $Q->bindValue(':description', 'test', PDO::PARAM_INT); 
     $Q->bindValue(':big_image', 'test', PDO::PARAM_INT); 

     try { 
      $Q->execute(); 
     } catch (PDOException $e) { 
      $rollback = true; 
     } 
    } 

    if ($rollback) { 
     echo 'rollbacking...'; 
     DBCon::getCon()->rollBack(); 
    } else { 
     echo 'commiting...'; 
     DBCon::getCon()->commit(); 
    } 

?> 

はなぜトランザクション全体がロールバックされていません...ロールバックされませんか?

ありがとうございます。

+1

自動コミットをオンにするかどうかをチェックします。 – khalid

答えて

2

自動コミットが有効になっているか、接続が持続していないか、またはinnodbを使用していません。

これは機能します。つまり、DBCon::getCon()は、自分が行っていると思わないことを意味します。

<?php 
    include('model/dbcon.model.php'); 

    $languages = array('project_nl', 'project_en'); 


    $connection = DBCon::getCon(); 

    $connection->beginTransaction(); 

    $rollback = true; 

    foreach($languages as $language) { 
     $Q = $connection->prepare('INSERT INTO `'.$language.'`(`id`, `name`, `description`, `big_image`) VALUES (:id,:name,:description,:big_image)'); 
     $Q->bindValue(':id', '1', PDO::PARAM_INT); 
     $Q->bindValue(':name', 'test', PDO::PARAM_INT); 
     $Q->bindValue(':description', 'test', PDO::PARAM_INT); 
     $Q->bindValue(':big_image', 'test', PDO::PARAM_INT); 

     try { 
      $Q->execute(); 
     } catch (PDOException $e) { 
      $rollback = true; 
     } 
    } 

    if ($rollback) { 
     echo 'rollbacking...'; 
     $connection->rollBack(); 
    } else { 
     echo 'commiting...'; 
     $connection->commit(); 
    } 

?> 
+0

考えられる理由の優れたリスト。私は#2に賭けるだろう –

+0

InnoDBを使用していない...ありがとう:) – Rubentje

関連する問題