Проблемы с использованием транзакций MySQL с циклами в PHP


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

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");
     }

Спасибо!

Author: littleK, 2010-07-25

2 answers

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

 3
Author: ircmaxell, 2010-07-25 20:29:57

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

 1
Author: Maerlyn, 2010-07-25 20:08:19