上方廣告

2009年3月2日 星期一

SqlTransaction VS TransactionScope

新的事務處理架構不再與數據庫綁在一起,而是從代碼塊的角度,當在通過 new 語句實例化 TransactionScope 時,事務管理器將確定要參與哪個事務。一經確定,此範圍將始終參與該事務。

也就是說只要是代碼塊是可以被事務管理器所管理的,則允許該代碼塊範圍所參與的事務繼續。如果事務範圍中的代碼發生了異常,它所參與的事務將回滾。也只有 當應用程序完成它要在一個事務中執行的所有工作以後,您應當調用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