public void Prepare(PreparingEnlistment preparingEnlistment)
{
if (_enlistDuringPrepare)
{
Trace(string.Format("MyEnlistment.Prepare - attempting another enlistment with options {0}", _enlistOptions.ToString()));
try
{
MyEnlistment enlist2 = new MyEnlistment(
_secondEnlistmentCompleted,
/*votePrepared=*/ true,
/*enlistDuringPrepare=*/ false,
_enlistOptions);
this.TransactionToEnlist.EnlistVolatile(enlist2, _enlistOptions);
if (!_expectSuccessfulEnlist)
{
// Force rollback of the transaction because the second enlistment was unsuccessful.
Trace("MyEnlistment.Prepare - Force Rollback because second enlistment succeeded unexpectedly");
_aborted = true;
_outcomeReceived.Set();
preparingEnlistment.ForceRollback(new ApplicationException("MyEnlistment voted ForceRollback"));
return;
}
}
catch (Exception ex)
{
if (_expectSuccessfulEnlist)
{
Trace(string.Format("MyEnlistment.Prepare - Force Rollback because second enlistment failed unexpectedly - {0}; {1}", ex.GetType().ToString(), ex.ToString()));
// Force rollback of the transaction because the second enlistment was unsuccessful.
_aborted = true;
_outcomeReceived.Set();
preparingEnlistment.ForceRollback(new ApplicationException("MyEnlistment voted ForceRollback"));
return;
}
}
}
if (_votePrepared)
{
Trace("MyEnlistment.Prepare voting Prepared");
preparingEnlistment.Prepared();
}
else
{
Trace("MyEnlistment.Prepare - Force Rollback");
_aborted = true;
_outcomeReceived.Set();
preparingEnlistment.ForceRollback(new ApplicationException("MyEnlistment voted ForceRollback"));
}
}