I see your point.

How about I start the transaction and then pass it to the macro? That way its transparent to the user what to use. That would remove any magic as well.

Macro is needed to handle exceptions in the body.

Would this change work?