Nøglen er at sætte PDO i undtagelsestilstand, mens det kun er unødvendigt at have try-catch for at foretage en rollback. Din kode er således i orden, ingen grund til at ændre den, hvis alt du ønsker er rollback ved fejl, så længe du har denne linje et sted:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
I tilfælde af fejl vil scriptet blive afsluttet, forbindelsen lukket og mysql vil med glæde rulle transaktionen tilbage for dig.
Hvis du stadig ønsker at rulle tilbage manuelt, bør du gøre det korrekt, ikke som det er sagt i de andre svar. Sørg for, at
- du fanger
Exception
, ikkePDOException
, da det er ligegyldigt, hvilken særlige undtagelse der afbrød udførelsen - du kaster igen en undtagelse efter rollback, for at blive underrettet om problemet
- også at en tabelmotor understøtter transaktioner (dvs. for Mysql skal det være InnoDB, ikke MyISAM).
Denne tjekliste er taget fra min artikel som du også kan finde nyttige i dette eller mange andre aspekter.