2011-06-23 23 views
5

私は、私が期待する方法を操作していない単純なtry catchを持っています。これは、PDOとの取引を使用しての私の最初の試みである: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; 
     } 

問題は$dbo->exec("TRUNCATE TABLE {$this->table}");がロールバックされません、$dbo->exec($insert);が失敗した場合、です。何か案は?

+0

'$ insert'とは何ですか? – tplaner

+0

文字列(動作しています)。しかし、意図的に例外をスローするために構文エラーを入れた場合、ロールバックするとテーブルのワイプが発生する前にロールバックされません – grep

答えて

7

TRUNCATEロールバックできません。代わりにDELETEを使用してください。

+0

これでテーブルと構造が保持されますか?私はデータだけを削除したいが、テーブル自体は削除しない。 – grep

+0

@Headspin: 'DELETE FROM table' ---すべての行を削除します(遅くなりますが、ロールバックをサポートします)。 – zerkms

+0

@Headspin:' DELETE FROM tablename' – zerkms

4

MySQLを使用していると仮定すると、TRUNCATE TABLEには暗黙のCOMMITがあります。 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. 
関連する問題