重要な部分は、PDOを例外モードに設定することです。 ロールバックを行うためだけにtry-catchを使用する必要はありません。したがって、コードは大丈夫です。この行がどこかにある限り、失敗時にロールバックするだけの場合は、コードを変更する必要はありません。
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
失敗した場合、スクリプトは終了し、接続が閉じられ、mysqlはトランザクションをロールバックします。
それでも手動でロールバックしたい場合は、他の回答で述べられているように、適切にロールバックする必要があります。
を確認してくださいException
をキャッチしています 、PDOException
ではありません 、どの特定の例外が実行を中止したかは問題ではないため- あなたは再投げています ロールバック後の例外で、問題が通知されます
- また、テーブルエンジンはトランザクションをサポートします(つまり、Mysqlの場合はMyISAMではなくInnoDBである必要があります)。
このチェックリストは、私の記事 から抜粋したものです。 これは、この側面や他の多くの側面でも役立つと思われます。