virtual internal void DelegatedTransactionEnded() { // Called by System.Transactions when the delegated transaction has // completed. We need to make closed connections that are in stasis // available again, or disposed closed/leaked non-pooled connections. // IMPORTANT NOTE: You must have taken a lock on the object before // you call this method to prevent race conditions with Clear and // ReclaimEmancipatedObjects. Bid.Trace("<prov.DbConnectionInternal.DelegatedTransactionEnded|RES|CPOOL> %d#, Delegated Transaction Completed.\n", ObjectID); if (1 == _pooledCount) { // When _pooledCount is 1, it indicates a closed, pooled, // connection so it is ready to put back into the pool for // general use. TerminateStasis(true); Deactivate(); // call it one more time just in case DbConnectionPool pool = Pool; if (null == pool) { throw ADP.InternalError(ADP.InternalErrorCode.PooledObjectWithoutPool); // pooled connection does not have a pool } pool.PutObjectFromTransactedPool(this); } else if (-1 == _pooledCount && !_owningObject.IsAlive) { // When _pooledCount is -1 and the owning object no longer exists, // it indicates a closed (or leaked), non-pooled connection so // it is safe to dispose. TerminateStasis(false); Deactivate(); // call it one more time just in case // it's a non-pooled connection, we need to dispose of it // once and for all, or the server will have fits about us // leaving connections open until the client-side GC kicks // in. #if !MOBILE PerformanceCounters.NumberOfNonPooledConnections.Decrement(); #endif Dispose(); } // When _pooledCount is 0, the connection is a pooled connection // that is either open (if the owning object is alive) or leaked (if // the owning object is not alive) In either case, we can't muck // with the connection here. }
internal virtual void DelegatedTransactionEnded() { Bid.Trace("<prov.DbConnectionInternal.DelegatedTransactionEnded|RES|CPOOL> %d#, Delegated Transaction Completed.\n", this.ObjectID); if (1 == this._pooledCount) { this.TerminateStasis(true); this.Deactivate(); DbConnectionPool pool = this.Pool; if (pool == null) { throw ADP.InternalError(ADP.InternalErrorCode.PooledObjectWithoutPool); } pool.PutObjectFromTransactedPool(this); } else if ((-1 == this._pooledCount) && !this._owningObject.IsAlive) { this.TerminateStasis(false); this.Deactivate(); this.PerformanceCounters.NumberOfNonPooledConnections.Decrement(); this.Dispose(); } }