title: What happens in  System.Data.SqlClient.SqlTransaction.Dispose?
body: <p>I looked at the Dispose() method in System.Data.SqlClient.SqlTransaction (using a decompiler):</p>
  
  <pre><code> protected override void Dispose(bool disposing)
      {
        if (disposing)
        {
          SNIHandle target = (SNIHandle) null;
          RuntimeHelpers.PrepareConstrainedRegions();
          try
          {
            target = SqlInternalConnection.GetBestEffortCleanupTarget(this._connection);
            if (!this.IsZombied)
            {
              if (!this.IsYukonPartialZombie)
                this._internalTransaction.Dispose();
            }
          }
          catch (OutOfMemoryException ex)
          {
            this._connection.Abort((Exception) ex);
            throw;
          }
          catch (StackOverflowException ex)
          {
            this._connection.Abort((Exception) ex);
            throw;
          }
          catch (ThreadAbortException ex)
          {
            this._connection.Abort((Exception) ex);
            SqlInternalConnection.BestEffortCleanup(target);
            throw;
          }
        }
        base.Dispose(disposing);
      }
  </code></pre>
  
  <p>Why does everyone say in forums that it is Rolling back in the dispose? Where does it rollback? </p>