Il metodo execute() non si aspetta una query SQL, si aspetta nulla se si usa prepare() , mentre un array contenente solo i parametri da passare allo statement se non si usa prepare().
Quindi execute() usato in quel modo non va bene, devi usare exec() se vuoi scrivere la query per intero senza usare parametri.
Assicurati che la connessione al db sia avvenuta correttamente e che non venga chiusa da qualche parte prima del codice che hai postato.
Se già beginTransaction() fallisce vai a finire nel catch e ovviamente, avendo fallito l'inizializzazione della transazione, non c'è alcuna transazione attiva su cui eseguire un rollback.
Devi distinguere quale eccezione è stata sollevata, non puoi dare per scontato che sia una query ad andare male, può anche essere altro.