2016-10-03 2 views
1

У меня есть цикл, который вставляет данные в две таблицы, в первой итерации цикла вставка является успешной, но во второй итерации вставка не удастся.Операция 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