Si la transaction échoue pour une raison quelconque, le code s'arrête à la ligne même où l'erreur s'est produite end puis l'exécution saute directement au bloc catch. Il suffit donc de la façon dont vous l'avez écrit dans le bloc de code 2.
Notez que vous devez toujours lever à nouveau l'exception après la restauration. Sinon, vous n'aurez jamais une idée de ce qui était un problème. Donc ça devrait être
try{
$stmt = $db->prepare(... 1 ...);
$stmt->execute();
$stmt = $db->prepare(... 2 ...);
$stmt->execute();
$stmt = $db->prepare(... 3 ...);
$stmt->execute();
$db->commit();
return true;
}catch(Exception $e){
$db->rollBack();
throw $e;
}