將不確定變為確定~transactionscope何時提升為分散式事務?(sql2005資料庫解決提升到MSDTC的辦法)
阿新 • • 發佈:2018-12-30
對於transactionscope不瞭解的同學,可以看我的相關文章
宣告:
對於這種事務,如果希望程式出錯自動回滾,必須將異常throw出來,不能愉愉的用日誌記錄!
測試:
對於sql2008已經很好的支援了transactionscope,而對於sql2005來說,支援的不是很好,它將多個savechanges()方法提升為分散式事務msdtc,它不管你是否為一個數據庫,真是無奈了!還好,最好找到了解決方法,下面圖所示,將多個insert,update包裹到一個transactionscope裡,所產生的結果如下:
簡單來說,就是sp_reset_connection重新使用一次SQL連結時,你的事務裡的程式碼是被包裹在一起傳送過來的,這時,如果有一條SQL語句出現異常,整個包會發生callback!
上面圖中,只要有一條語句出現SQL異常,都會發生回滾,從而保證了資料的完整性。
當然,我們的計算機中,並沒有開啟msdtc服務,有圖有真像
前提:Db資料上下文物件必須與action指向的方法體裡的上下文是同一個。
相關原始程式碼為:
var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)Db).ObjectContext; try { objectContext.Connection.Open();using (TransactionScope trans = new TransactionScope()) { insert1(); insert2(); } } catch (Exception) { throw; } finally { objectContext.Connection.Close(); }
OK,我們將上面程式碼進行一個封裝,讓它訪問起來更方便一些,看程式碼:
/// <summary> /// Author:zhang.zhanling /// 對TransactionScope,讓它對同一個資料庫不產生msdtc服務 /// </summary> public class TransactionScopeNoMsdtc { /// <summary> /// 產生包裹事務 /// </summary> /// <param name="db">資料上下文</param> /// <param name="isOutermost">是否為最外層,預設為false</param> /// <param name="action">處理程式碼塊</param> public static void UsingNoMsdtc(DbContext db, bool isOutermost, Action action) { var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext; try { if (objectContext.Connection.State == System.Data.ConnectionState.Closed) objectContext.Connection.Open(); using (TransactionScope trans = new TransactionScope()) { action(); trans.Complete(); } } finally { if (isOutermost)//如果是最外層事務,而將連線關閉 objectContext.Connection.Close(); } } /// <summary> /// 產生包裹事務,它不是最外層的,如果是最外層的需要呼叫其它過載 /// </summary> /// <param name="db"></param> /// <param name="action"></param> public static void UsingNoMsdtc(DbContext db, Action action) { UsingNoMsdtc(db, false, action); } }
在使用時,我們可以這樣來做,不用TransactionScope,而是用TransactionScopeNoMsdtc呵呵。
EntityFrameworks.Data.Core.TransactionScopeNoMsdtc.UsingNoMsdtc(Db, () =>
{
insert1();
insert2();
});
感謝閱讀!