2011-01-25 2 views
1

У меня есть код, который использовался в приложении, где у меня проблема с откатом. Даже если я '2 'возвращает ложный откат, не происходит, т. Е. Таблицы «продукты» теряются. Может ли кто-нибудь объяснить, почему он не работает или как его изменить. Примечание: Таблицы имеют Innodb engine..I использование MySQL 5.0+Ошибка MySQL Transaction + PHP в Mysql

mysql_query('SET AUTOCOMMIT=0;'); 
    mysql_query('START TRANSACTION;'); 
    $sql = 'DROP TABLE '.$this->Product->tablePrefix.'products'; 
    $s1 = mysql_query($sql); 
    $sql = 'RENAME TABLE '.$this->Product->tablePrefix.'temp12212 TO '.$this->Product->tablePrefix.'products'; 
    $s2 =mysql_query($sql); 
    if($s1 && $s2){ 
     mysql_query('COMMIT;'); 
     $this->Session->setFlash('Commit Successful to Database'); 
    }else{ 
     mysql_query('ROLLBACK;'); 
     $this->Session->setFlash('Commit failed due to some errors<br> auto-rollbacked to previous state'); 
    } 

ответ

2

DROP TABLE является одной из команд в MySql которые заставляют неявную фиксацию.

http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html

Используйте вместо этого:

'RENAME TABLE '.$this->Product->tablePrefix.'products TO backup_table 
, '.$this->Product->tablePrefix.'temp12212 TO '.$this->Product->tablePrefix.'products'; 
+0

rename также является братом-братом !!! :-(.. rename также выдает неявное сообщение. – Libu

+0

Я знаю, используйте 'RENAME', чтобы переименовать обе таблицы автоматически, а не транзакцию. –

+0

Работал :-) Спасибо за ответ !!! «RENAME» не может использоваться внутри «START TRANSACTION» и «COMMIT», но его можно использовать вместо него из-за его свойства атомарности ... – Libu

1

Вы не можете откатить DROP TABLE или RENAME TABLE заявление, как они вызывают implicit commit.

0
I sorted the problem this way instead!!! thanks all for your reply :-) 


$sql = 'DROP TABLE IF EXISTS '.$this->Product->tablePrefix.'temp_backup'; 
     mysql_query($sql); 
     $sql = 'RENAME TABLE '.$this->Product->tablePrefix.'products TO '.$this->Product->tablePrefix.'temp_backup, '.$this->Product->tablePrefix.'temp TO '.$this->Product->tablePrefix.'products'; 
     $status =mysql_query($sql); 
     if($status){ 
      $sql = 'DROP TABLE '.$this->Product->tablePrefix.'temp_backup'; 
      mysql_query($sql); 
      $this->Session->setFlash('Commit Successful to Database'); 
     }else{    
      $this->Session->setFlash('Commit failed due to some errors<br> auto-rollbacked to previous state'); 
     }