在進行數據持久化的時候,咱們會常常用到事務處理。通常狀況下,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方法,即便事務執行完成,也不會進行提交。若是出現異常,全部代碼都不會改變。工具
----------------------------------------------------------ui
ps:spa
1.還發現一個問題,數據庫也須要開啓分佈式事務的支持:右鍵「服務器鏈接」的屬性,在打開的屬性窗口選擇「鏈接」,在窗口右側,勾選「須要將分佈式事務用於服務器到服務器的通訊」,肯定便可。代理
2.須要打開分佈式的端口,端口號是135,或者添加System32下msdtc.exe的例外。blog
3.跨域的狀況有待考究。事務
4.在事務中,即便存在嵌套的狀況,同一個事務內的全部數據庫鏈接對數據都是可訪問的。
5.在事務中,若是使用Response.Redirect()方法跳轉到其它頁面,事務將沒法提交!