title: Is this TRANSACTION being ROLLBACK(ed) for me?
body: <p>If I cause an error by trying to create an existing table, the existing transaction appears to have already rolled back itself:</p>
  
  <pre><code>private void CreateSomeThings()
  {
      SqlConnection SqlConn = new SqlConnection(ConnectionString);
      SqlConn.Open();
  
      (new SqlCommand("BEGIN TRANSACTION", SqlConn)).ExecuteNonQuery();
  
      try
      {
          (new SqlCommand("CREATE TABLE sometable ([some_id] [int] IDENTITY(1,1) NOT NULL)", SqlConn)).ExecuteNonQuery();
  
          // Create the table again, but carry on by catching the exception
          try
          {
              (new SqlCommand("CREATE TABLE sometable ([some_id] [int] IDENTITY(1,1) NOT NULL)", SqlConn)).ExecuteNonQuery();
          }
          catch (Exception)
          {
          }
  
          // If another exception is thrown
          (new SqlCommand("bingy bongy boo", SqlConn)).ExecuteNonQuery();
  
          (new SqlCommand("COMMIT TRANSACTION", SqlConn)).ExecuteNonQuery();
      }
      catch (Exception Ex)
      {
          try
          {
              // ... then this command will fail with "no corresponding BEGIN TRANSACTION"
              (new SqlCommand("ROLLBACK TRANSACTION", SqlConn)).ExecuteNonQuery();
          }
          catch (Exception Ex2)
          {
              throw;
          }
      }
  }
  </code></pre>
  
  <p>I'd like to understand what's going on and why. I would expect that transaction rollback is my responsibility - with other errors it doesn't do that: for example, if I just call "bingy bongy" only the call throws an exception and I then <code>ROLLBACK</code> in the exception without any issues.</p>