This happens because BEGIN TRANSACTION statement written outside EXECUTE does not apply to it. EXECUTE creates its own transaction space. Also you need to rollback transaction by checking @@error value inside EXEC.
SET @Statement = 'begin tran bibble bibble bibble if @@error<>0 rollback tran'
"The IMPOSSIBLE is often UNTRIED"