MySQLでPDOのエラー時にロールバックされない
Laravel5.0で行数の多いCSVファイルの内容を MySQL の「LOAD DATA local INFILE 〜」コマンドを使ってデータベースを書き換えようとしています。
既存の内容を新しい内容で完全に置き換えるので、一旦内容を truncate してから書き込むようにしていますが、タイムアウトなどで処理が中断されてしまった場合はロールバックさせるために次のようにしました。($destination にはファイルの場所が格納されています。)
$query = sprintf("LOAD DATA local INFILE '%s' INTO TABLE `zip_codes` FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\n'
IGNORE 0 LINES (`zip`, `address1`, `address2`, `address3`)", addslashes($destination));
$pdo = DB::connection()->getpdo();
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
try {
$pdo->beginTransaction();
$pdo->exec("TRUNCATE TABLE `zip_codes`");
$pdo->exec($query);
$pdo->commit();
}catch(\PDOException $e){
$pdo->rollBack();
}
わざと存在しないファイル名を指定すると catch 部分は実行されているようですが内容は truncate で消去された状態のままでした。
専用の DB::transaction() や、DB::beginTransaction()、DB::rollback() を使ってみても catch 処理が行われる前にフレームワーク側で catch されてしまっているようで同じような結果になりました。
このような場合どのようにしてロールバック処理を行えばいいのでしょうか。
よろしくお願いします。