Als de transactie om welke reden dan ook mislukt, stopt de code op de regel waar de fout is opgetreden einde, dan springt de uitvoering direct naar het catch-blok. Het is dus voldoende zoals u het in codeblok 2 heeft geschreven.
Houd er rekening mee dat u altijd de uitzondering opnieuw moet gooien na het terugdraaien. Anders heb je nooit een idee wat een probleem was. Zo zou het moeten zijn
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;
}