La partie clé est de mettre PDO en mode exception, tout en ayant try-catch uniquement pour faire une restauration n'est pas nécessaire. Ainsi, votre code est correct, pas besoin de le modifier si tout ce que vous voulez est un rollback en cas d'échec, tant que vous avez cette ligne quelque part :
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
En cas d'échec, le script sera terminé, la connexion fermée et mysql se fera un plaisir d'annuler la transaction pour vous.
Au cas où vous voudriez toujours revenir en arrière manuellement, vous devriez le faire correctement, pas comme il est dit dans les autres réponses. Assurez-vous que
- vous attrapez
Exception
, pasPDOException
, car peu importe quelle exception particulière a interrompu l'exécution - vous relancez une exception après rollback, pour être notifié du problème
- également qu'un moteur de table prend en charge les transactions (c'est-à-dire que pour Mysql, ce devrait être InnoDB, pas MyISAM).
Cette checklist est tirée de mon article qui peuvent vous être utiles dans ce domaine ou dans de nombreux autres aspects également.