A parte principal é configurar o PDO no modo de exceção, enquanto ter try-catch apenas para fazer uma reversão é desnecessário. Assim, seu código está correto, não há necessidade de alterá-lo se tudo o que você deseja é reverter em caso de falha, desde que tenha esta linha em algum lugar:
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
Em caso de falha, o script será encerrado, a conexão será fechada e o mysql terá prazer em reverter a transação para você.
Caso você ainda queira reverter manualmente, você deve estar fazendo isso corretamente, não como é dito nas outras respostas. Certifique-se de que
- você está pegando
Exception
, nãoPDOException
, pois não importa qual exceção específica abortou a execução - você está relançamento uma exceção após a reversão, para ser notificado do problema
- também que um mecanismo de tabela suporta transações (ou seja, para Mysql deve ser InnoDB, não MyISAM).
Esta lista de verificação foi retirada de meu artigo que você pode achar útil neste ou em muitos outros aspectos também.