Kluczową częścią jest ustawienie PDO w trybie wyjątku, podczas gdy próba złapania tylko w celu wycofania jest niepotrzebna. Tak więc twój kod jest w porządku, nie ma potrzeby go zmieniać, jeśli wszystko, czego chcesz, to cofnięcie zmian w przypadku niepowodzenia, o ile masz gdzieś tę linię:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
W przypadku niepowodzenia skrypt zostanie zakończony, połączenie zamknięte, a mysql z przyjemnością cofnie transakcję za Ciebie.
Jeśli nadal chcesz wycofać ręcznie, powinieneś robić to poprawnie, a nie tak, jak zostało to powiedziane w innych odpowiedziach. Upewnij się, że
- łapiesz
Exception
, a niePDOException
, ponieważ nie ma znaczenia, który wyjątek przerwał wykonanie - wyrzucasz ponownie wyjątek po wycofaniu, aby zostać powiadomionym o problemie
- również, że silnik tabel obsługuje transakcje (tj. dla Mysql powinien to być InnoDB, a nie MyISAM).
Ta lista kontrolna pochodzi z mojego artykułu które mogą okazać się przydatne w tym lub wielu innych aspektach.