I think that the problem is the multiple components not being part of the same transaction.
One component must start the transaction then call the other components with a special syntax (that I can't remember right now) to make them part of the transaction.
By doing this, if at any place someone calls SetAbort, the whole transaction will be aborted.