IEnlistmentNotification.InDoubt(Enlistment) Method


Notifies an enlisted object that the status of a transaction is in doubt.

 void InDoubt(System::Transactions::Enlistment ^ enlistment);
public void InDoubt (System.Transactions.Enlistment enlistment);
abstract member InDoubt : System.Transactions.Enlistment -> unit
Public Sub InDoubt (enlistment As Enlistment)



An Enlistment object used to send a response to the transaction manager.


This method is called for volatile resources when the transaction manager has invoked a single phase commit operation to a single durable resource, and then connection to the durable resource was lost prior to getting the transaction result. At that point, the transaction outcome cannot be safely determined.

As InDoubt is considered to be a final state for a transaction, you should not call Commit or Rollback after calling InDoubt.


Your implementation of this method for the volatile resource should perform whatever recovery or containment operation it understands on the affected data. It must also call the Done method on the on the enlistment parameter when it has finished its work.

If the resource manager has enlisted durably, but does not respond by calling Done method, the transaction manager is unsure that the resource manager has received the InDoubt call. As such, the transaction manager keeps waiting for a response, and maintains information relevant to this transaction. If Done is never called, this piece of information is kept around indefinitely in memory or in a system-wide resource. This results in resources not being able to be reclaimed. In the case of a distributed transaction, this could eventually fill the MSDTC log which halts the MSDTC process. In the case of a transaction managed by System.Transactions, this results in a gradual and continual increase in the memory consumption of the resource manager's process. Therefore, it is crucial that you call the Done method once your resource manager is done with your prepare work.

Applies to