TransactionScope使用說明

2022-01-11 20:22:05 字數 3094 閱讀 1145

transactionscope是.net framework 2.0滯後,新增了乙個命名空間。它的用途是為資料庫訪問提供了乙個「輕量級」[區別於:sqltransaction]的事物。使用之前必須新增對 system.transactions.dll 的引用。

下列**就是乙個正在建立的事務,這個事務自身還封裝了多個資料庫查詢。只要任意乙個 sqlcommand 物件引發異常,程式流控制就會跳出 transactionscope 的 using 語句塊,隨後,transactionscope 將自行釋放並回滾該事務。由於這段**使用了 using 語句,所以 sqlconnection 物件和 transactionscope 物件都將被自動呼叫dispose()釋放。由此可見,只需新增很少的幾行**,您就可以構建出乙個事務模型,這個模型可以對異常進行處理,執行結束後會

自行清理,此外,它還可以對命令的提交或回滾進行管理。

//建立transactionscope

wps_clip_image-8386using (transactionscope tscope= new transactionscope())

wps_clip_image-10230wps_clip_image-16703

wps_clip_image-15176 using (sqlconnection cn2005= new sqlconnection(anothersql2005))

wps_clip_image-30312wps_clip_image-12410

wps_clip_image-175

wps_clip_image-27966 tscope.complete();

wps_clip_image-554}

連線字串關鍵字(enlist)

sqlconnection.connectionstring 屬性支援關鍵字 enlist,該關鍵字指示 system.data.sqlclient 是否將檢測事務上下文並自動在分布式事務中登記連線。 如果 enlist=true,連線將自動在開啟的執行緒的當前事務上下文中登記。 如果 enlist=false,sqlclient 連線不會與分布式事務進行互動。 enlist 的預設值為 true。 如果連線字串中未指定 enlist,若在連線開啟時檢測到乙個,連線將自動在分布式事務中登記。  

server=(local)sql2005;database=northwind;integrated security=sspi;auto-enlist=false

上面所看到的示例中我們使用了transactionscope的預設設定。transactionscope有三種模式:

transactionscopeoptions

描述required

如果已經存在乙個事務,那麼這個事務範圍將加入已有的事務。否則,它將建立自己的事務。

requiresnew

這個事務範圍將建立自己的事務。

suppress

如果處於當前活動事務範圍內,那麼這個事務範圍既不會加入氛圍事務 (ambient transaction),也不會建立自己的事務。當部分**需要留在事務外部時,可以使用該選項。

您可以在**的任何位置上隨是檢視是否存在事務範圍,具體方法就是檢視 system.transactions.transaction.current 屬性。如果這個屬性為「null」,說明不存在當前事務。

若要更改 transactionscope 類的預設設定,您可以建立乙個 transactionoptions 物件,然後通過它在 transactionscope 物件上設定隔離級別和事務的超時時間。transactionoptions 類有乙個 isolationlevel 屬性,通過這個屬性可以更改隔離級別,例如從預設的可序列化 (serializable) 改為readcommitted,甚至可以改為 sql server 2005 引入的新的快照 (snapshot) 級別。(請記住,隔離級別僅僅是乙個建議。大多數資料庫引擎會試著使用建議的隔離級別,但也可能選擇其他級別。)此

外,transactionoptions 類還有乙個 timeout 屬性,這個屬性可以用來更改超時時間(預設設定為 1 分鐘)。

下列**中使用了預設的 transactionscope 物件及其預設建構函式。也就是說,它的隔離級別設定為可序列化 (serializable),事務的超時時間為 1 分鐘,而且 transactionscopeoptions 的設定為 required。

transactionoptions topt= new transactionoptions();

//設定transactionoptions模式

topt.isolationlevel= isolationlevel.readcommitted;

// 設定超時間隔為2分鐘,預設為60秒

topt.timeout= new timespan(0,2,0);

string cnstring= configurationmanager.connectionstrings["sql2005dbserver"].connectionstring);

using (transactionscope tscope= new transactionscope(transactionscopeoption.requiresnew, topt))

tscope.complete();

}

巢狀應用

如下列**,假設 method1 建立乙個 transactionscope,針對乙個資料庫執行一條命令,然後呼叫 method2。method2 建立乙個自身的 transactionscope,並針對乙個資料庫執行另一條命令。 

private void method1()

method2();

ts.complete();}}

private void method2()

ts.complete();

}}

總結:進入和退出事務都要快,這一點非常重要,因為事務會鎖定寶貴的資源。最佳實踐要求我們在需要使用事務之前再去建立它,在需要對其執行命令前迅速開啟連線, 執行動作查詢 (action query),並盡可能快地完成和釋放事務。在事務執行期間,您還應該避免執行任何不必要的、與資料庫無關的**,這能夠防止資源被毫無疑義地鎖定過長的

時間。

TransactionScope使用說明

transactionscope是.net framework 2.0滯後,新增了乙個命名空間。它的用途是為資料庫訪問提供了乙個 輕量級 區別於 sqltransaction 的事務。使用之前必須新增對 system.transactions.dll 的引用。下列 就是乙個正在建立的事務,這個事務自...

TransactionScope的正確用法

前一陣貼了乙個關於transactionscope的貼子,以為是ms的bug。後來經過認真仔細的除錯,才找到原因。原來的 本身是沒有沒問題的。只是關於事務資源的處理放錯了地方。正確的寫法應該如下 如果a類是使用資料庫資源的。class a sqlconnection cn null public a...

TransactionScope的正確用法

前一陣貼了乙個關於transactionscope的貼子,以為是ms的bug。後來經過認真仔細的除錯,才找到原因。原來的 本身是沒有沒問題的。只是關於事務資源的處理放錯了地方。正確的寫法應該如下 如果a類是使用資料庫資源的。class a sqlconnection cn null public a...