2012-08-31 3 views
1

У меня есть следующий код:PHP Mysqli нескольких запросов + Transaction

... 
$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(); 
     } 

... 

В случае ошибки я получаю правильное $valid_entry значение 0, но откат не работает. Даже если я буду называть некоторые команды TRUNCATE ложно, он все равно будет выполнять остальные команды, дайте мне ошибку, но она не откат.

Кто-нибудь знает, как правильно использовать транзакцию на mysqli?

ответ

3

Из MySQL Reference Manual для TRUNCATE TABLE (курсив мой):

Логически, TRUNCATE TABLE похож на ВЕЬЕТЕ что удаляет все строки, или последовательность DROP TABLE и CREATE TABLE заявления. Для достижения высокой производительности он обходит метод DML , удаляя данные. Таким образом, не может быть откат, он не вызывает ON Триггеры DELETE для запуска, и он не может быть выполнен для таблиц InnoDB с отношениями внешнего ключа родитель-ребенок.

Если вы хотите, чтобы иметь возможность ROLLBACK вы собираетесь должны использовать DELETE заявления вместо этого. Здесь они менее эффективны, но должны дать вам желаемое поведение.

+0

Спасибо за ваш ответ! Теперь, что вы предлагаете мне? Оставьте его таким, какой он есть, и все равно получите некоторые из усечений, которые запускаются в любом случае, или есть альтернативный метод? –

+0

Обновлен мой ответ. –

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