Klíčovou částí je nastavení PDO v režimu výjimky zatímco mít try-catch pouze pro provedení rollbacku je zbytečné. Váš kód je tedy v pořádku, není třeba jej měnit, pokud vše, co chcete, je vrácení zpět při selhání, pokud máte někde tento řádek:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
V případě neúspěchu bude skript ukončen, připojení uzavřeno a mysql za vás rád vrátí transakci.
V případě, že se stále chcete vrátit zpět ručně, měli byste to dělat správně, ne jak je řečeno v ostatních odpovědích. Ujistěte se, že
- chytáte
Exception
, nikoliPDOException
, protože nezáleží na tom, která konkrétní výjimka exekuci přerušila - znovu házíte výjimku po vrácení zpět, abyste byli informováni o problému
- také že tabulkový stroj podporuje transakce (tj. pro Mysql by to mělo být InnoDB, nikoli MyISAM).
Tento kontrolní seznam je převzat z mého článku který vám může být užitečný v tomto nebo v mnoha dalších aspektech.