2011-06-23 21 views
5

Tengo un simple intento de captura que no funciona como yo esperaría. Este es mi primer intento en el uso de transacciones con DOP:Problemas de transacción 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; 
     } 

El problema es, si el $dbo->exec($insert); falla, el $dbo->exec("TRUNCATE TABLE {$this->table}"); no consigue deshacerse. ¿Algunas ideas?

+0

¿Qué es '$ insert'? – tplaner

+0

Una cadena (que está funcionando). Pero si coloqué intencionadamente un error de sintaxis para que arroje una excepción, cuando se retrotrae, no se revierte antes de que pase la eliminación de la tabla. – grep

Respuesta

7

TRUNCATE no se puede revertir. Use DELETE en su lugar.

+0

¿Con esto retiene la tabla y su estructura? Solo quiero eliminar los datos pero no la tabla en sí. – grep

+0

@Headspin: 'DELETE FROM table' --- eliminará todas las filas (aunque será más lento, pero admite reversiones) – zerkms

+0

@Headspin:' DELETE FROM tablename' – zerkms

4

Suponiendo que está utilizando MySQL, TRUNCATE TABLE tiene un COMPROMISO implícito. De la documentación en 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.