在進行資料持久化的時候,我們會經常用到交易處理。一般情況下,ADO.NET中的交易處理就能夠滿足我們的需要,但是,ADO.NET中的事務不能同事對多個資料庫連接進行原子性的操作;如果在你的業務環境中存在多個資料庫、檔案寫入等操作,同時需要保證資料完整性和一致性的時候,你可以考慮使用.NET提供的分散式交易處理。
使用分散式交易處理,需要Windows系統的支援,所以,我們需要將系統的MSDTC服務開啟。步驟:管理工具>元件服務;依次展開 主控台根目錄>元件服務>電腦>我的電腦;在“我的電腦”節點上右鍵開啟“屬性”;在選項卡中勾選“使用本地協調器”,然後點擊“確定”按鈕,如:
設定完成以後,我們就可以很方便的使用分散式交易處理了。首先,在項目中添加“System.Transactions”引用,然後編寫如下代碼:
class TransactionEx { /// <summary> /// 用事務執行一個方法,並設定逾時時間 /// </summary> /// <param name="action">方法代理</param> /// <param name="timeout">逾時時間</param> public static void InvokAction(Action action, int timeout) { TransactionOptions transactionOption = new TransactionOptions(); transactionOption.Timeout = TimeSpan.FromSeconds(timeout); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption)) { action.Invoke(); scope.Complete(); } } }
以上這段代碼是執行事務的核心代碼,你只需要將要執行代碼作為一個委託傳入InvokAction,並出入一個逾時時間就可以了。在事務執行結尾,調用Complete方法,可以將事務提交。如果沒有調用Complete方法,即使事務執行完成,也不會進行提交。如果出現異常,所有代碼都不會改變。
----------------------------------------------------------
ps:
1.還發現一個問題,資料庫也需要開啟分散式交易的支援:右鍵“伺服器串連”的屬性,在開啟的屬性視窗選擇“串連”,在視窗右側,勾選“需要將分散式交易用於伺服器到伺服器的通訊”,確定即可。
2.需要開啟分布式的連接埠,連接埠號碼是135,或者添加System32下msdtc.exe的例外。
3.跨域的情況有待考究。
4.在事務中,即使存在嵌套的情況,同一個事務內的所有資料庫連接對資料都是可訪問的。
5.在事務中,如果使用Response.Redirect()方法跳轉到其它頁面,事務將無法提交!