2011-06-23 15 views
5

Mam prosty test catch, który nie działa tak, jak bym się spodziewał. Jest to moja pierwsza próba przy użyciu transakcji z PDO:Problemy z transakcjami PHP PDO

try 
     { 
      $dbo = Db::init(); 
      $dbo->beginTransaction(); 
      $dbo->exec("TRUNCATE TABLE {$this->table}"); 
      $dbo->exec($insert); 
      $dbo->commit(); 
     } 
     catch(Exception $e) 
     { 
      $dbo->rollBack(); 
      echo 'Failed to sync ' . $this->table; 
     } 

Problem jest, jeśli $dbo->exec($insert); zawiedzie, $dbo->exec("TRUNCATE TABLE {$this->table}"); nie zostanie wycofana. Jakieś pomysły?

+0

Co to jest '$ insert'? – tplaner

+0

Ciąg (który działa). Ale jeśli celowo umieszczę w nim błąd składni, aby rzucił wyjątek, po wycofaniu nie wycofa się przed przetarciem tabeli. – grep

Odpowiedz

7

TRUNCATE nie można wycofać. Zamiast tego użyj DELETE.

+0

Czy to zachowuje tabelę i jej strukturę? Chcę tylko usunąć dane, ale nie samą tabelę. – grep

+0

@Headspin: 'DELETE FROM table' --- usunie wszystkie wiersze (będzie wolniej, ale obsługuje wycofywanie zmian) – zerkms

+0

@Headspin:' USUŃ Z nazwy zbioru' – zerkms

4

Zakładając, że używasz MySQL, TRUNCATE TABLE ma domyślny COMMIT. Z dokumentacji pod adresem http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html:

As of MySQL 5.0.8, truncate operations cause an implicit commit. Before 5.0.8, truncate operations are not transaction-safe; an error occurs when attempting one in the course of an active transaction.