[英]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構造中。
確認,這非常有效,並且(至少在我們公司這里)甚至被認為是正確的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.