2010-07-25 3 views
2

Я пытаюсь настроить транзакцию MySQL, чтобы я мог выполнить цикл запросов (см. Ниже), и если какой-либо из них не работает, откатите все изменения. Однако я нахожу, что если кто-то терпит неудачу, не все запросы откатываются назад. Я делаю что-то неправильно здесь?Проблема с использованием транзакций MySQL с циклами в PHP

mysql_query("START TRANSACTION"); 

    foreach($array1 as $arr){ 

      // loop SQL query 

      if(mysql_error()){ 
       $failed = "..."; 
      } 
    } 


    foreach($array2 as $arr){ 

      // loop SQL query 

      if(mysql_error()){ 
       $failed = "..."; 
      } 
    } 

    if(isset($failed)){ 
      mysql_query("ROLLBACK"); 
    } else { 
      mysql_query("COMMIT"); 
    } 

Спасибо!

ответ

3

Причина в том, что если запрос не выполняется (из-за ошибки), транзакция автоматически откатывается и завершается. Таким образом, вы должны прекратить цикл, если запрос завершается с ошибкой, потому что что-либо, выполняемое после неудачного запроса, будет автокомментировать (или, по крайней мере, быть в другой транзакции, если AUTOCOMMIT выключен) ...

1

Вы используете безопасный для транзакции тип таблицы? По умолчанию MyISAM не поддерживает транзакции, я рекомендую использовать InnoDB.

Смежные вопросы