Simples, basta utilizar um Try/Catch com as seguintes orientações:
- O primeiro comando depois do Try deve ser o Utils.IniciaTransacao();
- O ultimo comando antes do Catch deve ser o Utils.ConfirmaTransacao();
- O primeiro comando depois do Catch deve ser o Utils.CancelaTransacao();
Desta forma, é garantido que outros comandos não irão impactar no fluxo de gestão das transações.
try { Utils.IniciaTransacao(); ... Utils.ConfirmaTransacao(); } catch { Utils.CancelaTransacao(); ... }