System.Transactions 基礎結構既提供了基於 Transaction 類的顯式編程模型,也提供了使用 TransactionScope 類的隱式編程模型,在後一種模型中,事務由該基礎結構自動管理。編程
重要說明: |
建議使用 TransactionScope 類建立隱式事務,以便自動爲您管理環境事務上下文。對於須要跨多個函數調用或多個線程調用使用相同事務的應用程序,您還應該使用 TransactionScope 和 DependentTransaction 類。有關此模型的更多信息,請參見使用事務範圍實現隱式事務 主題。有關編寫事務性應用程序的更多信息,請參見編寫事務應用程序。併發 |
在經過 new 語句實例化 TransactionScope 時,事務管理器將肯定要參與哪一個事務。一經肯定,此範圍將始終參與該事務。此決策基於兩個因素:是否存在環境事務以及構造函數中 TransactionScopeOption 參數的值。 環境事務是在其中執行您的代碼的事務。經過調用 Transaction 類的 Current 靜態屬性可獲取對環境事務的引用。有關如何使用此參數的更多信息,請參見 使用事務範圍實現隱式事務 主題的「事務流管理」一節。分佈式
若是在事務範圍中(即從初始化 TransactionScope 對象到調用其 Dispose 方法之間)未發生異常,則容許該範圍所參與的事務繼續。若是事務範圍中的確發生了異常,它所參與的事務將回滾。函數
當應用程序完成它要在一個事務中執行的全部工做之後,您應當只調用 Complete 方法一次,以通知事務管理器能夠接受提交事務。未能調用此方法將停止該事務。性能
對 Dispose 方法的調用標誌着該事務範圍的結束。在調用此方法以後發生的異常不會影響該事務。spa
若是在範圍中修改 Current 的值,則會在調用 Dispose 時引起異常。可是,在該範圍結束時,先前的值將被還原。此外,若是在建立事務的事務範圍內對 Current 調用 Dispose,則該事務將在相應範圍末尾處停止。.net
注意事項:線程
TransactionScope 使用注意事項
在
TransactionScope中,若是不是必需要避免它啓用DTC分佈式事務,由於性能低下;
而對於
TransactionScope來講它是以鏈接對象Connection作爲識別單位的,
也就是說即使是相同鏈接字符串ConnectionString的兩個鏈接對象Connection在
TransactionScope也是會啓用DTC分佈式事務的,
避免的方法就是在一個
TransactionScope中使用一個惟一的鏈接對象Connection。
?
在
TransactionScope中默認的事務級別是Serializable,即在事務過程當中,徹底性鎖表。
別的進程不能查詢,修改,新增,刪除。這樣會致使效率大大下降,雖然數據完整性很高。
一般咱們不須要那麼高的數據完整性。因此須要修改默認的事務級別:
?
事務級別:
成員名稱????????????????? 說明?
Chaos??????????????????? 沒法改寫隔離級別更高的事務中的掛起的更改。??
ReadCommitted??????? 不能夠在事務期間讀取可變數據,可是能夠修改它。??
ReadUncommitted???? 能夠在事務期間讀取和修改可變數據。??
RepeatableRead???????能夠在事務期間讀取可變數據,可是不能夠修改。能夠在事務期間添加新數據。??
Serializable??????????????能夠在事務期間讀取可變數據,可是不能夠修改,也不能夠添加任何新數據。??
Snapshot????????????????能夠讀取可變數據。在事務修改數據以前,它驗證在它最初讀取數據以後另外一個事務是否更改過這些數據。
??????????????????????????? 若是數據已被更新,則會引起錯誤。這樣使事務可獲取先前提交的數據值。
?
在嘗試提高以此隔離級別建立的事務時,將引起一個?InvalidOperationException,併產生錯誤信息
"Transactions?with?IsolationLevel?Snapshot?cannot?be?promoted"(沒法提高具備?IsolationLevel?快照的事務)
?
Unspecified??????????????正在使用與指定隔離級別不一樣的隔離級別,可是沒法肯定該級別。若是設置了此值,則會引起異常。??
當程序調用併發執行時,可要謹慎使用此方法。