SqlTransaction VS TransactionScope
新的事務處理架構不再與數據庫綁在一起,而是從代碼塊的角度,當在通過 new 語句實例化 TransactionScope 時,事務管理器將確定要參與哪個事務。一經確定,此範圍將始終參與該事務。
也就是說只要是代碼塊是可以被事務管理器所管理的,則允許該代碼塊範圍所參與的事務繼續。如果事務範圍中的代碼發生了異常,它所參與的事務將回滾。也只有 當應用程序完成它要在一個事務中執行的所有工作以後,您應當調用TransactionScope的Complete 方法,以通知事務管理器可以接受提交事務。如在代碼塊內未能調用此方法將中止該事務,也就是隱式的進行了Rollback。對 Dispose 方法的調用標誌著該事務範圍的結束。在調用此方法之後發生的異常不會影響該事務。
以下為舊版SqlTransaction的用法
使用TransactionScope的用法 ,此用法必須先加入System.Transactions.DLL
**注意此用法適用於SQL Server2005,SQL Server2000需要安裝配置DTC,因此建議用老式寫法就好
關於更多文章請參考微軟MSDN
也就是說只要是代碼塊是可以被事務管理器所管理的,則允許該代碼塊範圍所參與的事務繼續。如果事務範圍中的代碼發生了異常,它所參與的事務將回滾。也只有 當應用程序完成它要在一個事務中執行的所有工作以後,您應當調用TransactionScope的Complete 方法,以通知事務管理器可以接受提交事務。如在代碼塊內未能調用此方法將中止該事務,也就是隱式的進行了Rollback。對 Dispose 方法的調用標誌著該事務範圍的結束。在調用此方法之後發生的異常不會影響該事務。
以下為舊版SqlTransaction的用法
SqlConnection conn = new SqlConnection();
SqlTransaction trans = default(SqlTransaction);
try
{
conn.ConnectionString = Application["SQLConnectionString"].ToString();
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SqlString";
trans = conn.BeginTransaction();
//此處需把cmd與trans掛在一起
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
trans.Commit();
}
catch (Exception)
{
//發生錯誤時從暫止狀態復原交易
trans.Rollback();
}
finally
{
conn.Close();
}
使用TransactionScope的用法 ,此用法必須先加入System.Transactions.DLL
SqlConnection conn = new SqlConnection();
using (TransactionScope scope = new TransactionScope())
{
try
{
conn.ConnectionString = Application["SQLConnectionString"].ToString();
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SqlString";
cmd.ExecuteNonQuery();
scope.Complete();
}
catch (Exception)
{ }
finally
{
conn.Close();
}
}
**注意此用法適用於SQL Server2005,SQL Server2000需要安裝配置DTC,因此建議用老式寫法就好
關於更多文章請參考微軟MSDN
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。