Je serait plus serein avec un try catch autour de la transaction. Structure classique:
begin transaction
try
    lot of stuff
catch
    print "error"
    rollback transaction
end catch
commit transaction