gli esempi che hai fatto sono due casi troppo diversi, in uno usi le transazioni e nell'altro no... e cmq potevi usare nel primo lo stesso approcio del secondo. io posso dirti quando è preferibile usare i prepared statements.

anzitutto per motivi di sicurezza, le sql injection sono praticamente impossibili usando questo approcio

per il resto ti faccio un esempio banale ma concreto di quando è preferibile usarle:

codice:
$mioArray = array(
  1,
  2,
  3,
  4,
  5
);

$sth = $dbh->prepare("SELECT * from tabella where id = :id");
foreach($mioArray as id) {
  $sth->bindParam(':id', $id);
  $sth->execute(); 
}

ora è chiaro che in questo caso serve a poco ma immginalo con una query che deve ricevere dall'esterno un gran numero di parametri... la prepare basta farla una sola all'esterno del ciclo, poi viene riutilizzata passando i valori con bindParam, senza bisogno di inizializzare ogni volta $sth all'interno del foreach, risparmi risorse e l'esecuzione è piu veloce se devi farne qualche centinaio...