ITransaction::Commit can return XACT_E_INDOUBT, without giving you any information about the outcome of the transaction. This can happen if the connection between the MSDTC proxy and the TM was lost. The transaction may have committed or aborted.

The MSDTC TM doesn't provide you a way to query for transaction outcome based on transaction id. If you really need to know the outcome of the transaction you need to create a separate mechanism. One mechanism is to create a MSDTC-compliant resource manager that enlists in the same transaction and logs the outcome of the transaction along with the ID. Your app will be able to query this RM to find the outcome when Commit returns "in doubt". Beware that even with this mechanism, the outcome of the transaction may not be available immediately. To be exact, the outcome will be available only after Phase 1 of the transaction was completed or the transaction timeout was reached, whichever comes first.