internal void Deactivate(bool connectionIsDoomed)
{
// Called when the connection that owns us is deactivated.
if (MARSOn)
{
_sessionPool.Deactivate();
}
Debug.Assert(connectionIsDoomed || null == _pendingTransaction, "pending transaction at disconnect?");
if (!connectionIsDoomed && null != _physicalStateObj)
{
if (_physicalStateObj._pendingData)
{
DrainData(_physicalStateObj);
}
if (_physicalStateObj.HasOpenResult)
{ // Need to decrement openResultCount for all pending operations.
_physicalStateObj.DecrementOpenResultCount();
}
}
// Any active, non-distributed transaction must be rolled back. We
// need to wait for distributed transactions to be completed by the
// transaction manager -- we don't want to automatically roll them
// back.
//
// Note that when there is a transaction delegated to this connection,
// we will defer the deactivation of this connection until the
// transaction manager completes the transaction.
SqlInternalTransaction currentTransaction = CurrentTransaction;
if (null != currentTransaction && currentTransaction.HasParentTransaction)
{
currentTransaction.CloseFromConnection();
Debug.Assert(null == CurrentTransaction, "rollback didn't clear current transaction?");
}
Statistics = null; // must come after CleanWire or we won't count the stuff that happens there...
}