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,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。