簡體   English   中英

SqlTransaction.Commit()之前的SqlCommand.Dispose()?

[英]SqlCommand.Dispose() before SqlTransaction.Commit()?

是否可以在提交事務之前處理分配給事務的命令? 我自己測試了以下代碼,它似乎運行良好,但這是一個相當小的例子,所以如果有人肯定知道我正在尋找確認。

internal static void TestTransaction()
{
    try
    {
        Program.dbConnection.Open();
        using (SqlTransaction transaction = Program.dbConnection.BeginTransaction())
        {
            Boolean doRollback = false;
            for (int i = 0; i < 10; i++)
            {
                using (SqlCommand cmd = new SqlCommand("INSERT INTO [testdb].[dbo].[transactiontest] (testvalcol) VALUES (@index)", Program.dbConnection, transaction))
                {
                    cmd.Parameters.AddWithValue("@index", i);
                    try
                    {
                        cmd.ExecuteNonQuery();
                    }
                    catch (SqlException)
                    {
                        doRollback = true;
                        break;
                    }
                }
            }
            if (doRollback)
                transaction.Rollback();
            else
                transaction.Commit();
        }
    }
    finally
    {
        Program.dbConnection.Close();
    }
}

連接,事務和命令對象只是將命令發送到數據庫的工具。 執行命令后,數據庫已收到該命令。 無論你以后如何處理命令對象,將其丟棄,焚燒或射向月球,這一事實都不會改變。 (它只能回滾)。

您可以在一個SqlConnection的范圍內(使用或不使用SqlTransaction )創建和配置任意數量的命令。 您可以在一個SqlConnection啟動和處理任意數量的事務。 為了證明這一點,請參閱:

using (var conn = new SqlConnection(@"server=(local)\sql2008;database=Junk;Integrated Security=SSPI"))
{
  conn.Open();
  // Repeat this block as often as you like...
  using (var tran = conn.BeginTransaction())
  {
    using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess1')", conn, tran))
    {
      cmd.ExecuteNonQuery(); // Shows in Sql profiler
    }
    tran.Commit(); // Commits
  }
  using (var cmd = new SqlCommand("INSERT INTO Mess VALUES ('mess2')", conn))
  {
    cmd.ExecuteNonQuery(); // Executes and commits (implicit transaction).
  }
}

當然,對於健康的代碼,您需要以正確的順序處理所有對象。 在部署SqlConnection后處置命令可能會導致連接對象保留在內存中。

是的,它可能是安全的。 using()正在關閉Command,而不是Connection。

但是你應該將該Connection放在另一個using()塊或try / finally構造中。

確認,這非常有效,並且(至少在我們公司這里)甚至被認為是正確的方法。

  1. 創建連接
  2. 創建交易
  3. 創建命令,使用事務,執行
  4. 處置命令
  5. 提交事務
  6. 處理連接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM