中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

將不確定變為(wei)確定~transactionscope何時提升為(wei)分布式事(shi)務?(sql2005數據庫解決(jue)提升到MSDTC的辦法)

回到目錄

對于transactionscope不了解的(de)同(tong)學(xue),可以(yi)看我(wo)的(de)相(xiang)關文章

 

第二十六回   將不確定變為確定~transactionscope何時提升為分布式事務?

第二十七回(hui)   將不確定變為確定~transactionscope何時提升為分布式事務~續

第二(er)十(shi)八回   將不確定變為確定~transactionscope何時提升為分布式事務~再續(避免引起不必要的MSDTC)

第二十九回   將不確定變為確定~transactionscope何時提升為分布式事務~大結局

第三十七回   將不確定變為確定~transactionscope何時提升為分布式事務~SQL2005與SQL2008不同

聲明:

對于(yu)這種事務,如(ru)果(guo)希望(wang)程序出錯自動回滾,必須將異常throw出來,不(bu)能愉(yu)愉(yu)的用(yong)日志(zhi)記(ji)錄(lu)!

測試:

對于sql2008已經很好的(de)支持了transactionscope,而對于sql2005來說,支持的(de)不(bu)(bu)是很好,它(ta)將(jiang)多(duo)個(ge)savechanges()方(fang)法(fa)提升為分(fen)布(bu)式(shi)事務msdtc,它(ta)不(bu)(bu)管你是否為一個(ge)數據庫,真是無奈了!還好,最好找到了解(jie)決方(fang)法(fa),下面圖所示,將(jiang)多(duo)個(ge)insert,update包裹到一個(ge)transactionscope里,所產生的(de)結果如下:

簡(jian)單來說,就是sp_reset_connection重新使用一(yi)次SQL鏈接時,你的事務里的代碼是被包裹在一(yi)起發(fa)送過(guo)來的,這(zhe)時,如果有一(yi)條SQL語句出現異常,整個包會發(fa)生callback!

上面圖中,只要有一條語句出現SQL異常,都會發生回滾,從而保證了數據的完整性。

當然,我們的計算(suan)機中,并(bing)沒有(you)開啟msdtc服(fu)務,有(you)圖有(you)真像

前提: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,我們(men)將上面代碼進行(xing)一個封(feng)裝(zhuang),讓它訪問起來更(geng)方便一些,看代碼:

 /// <summary>
    /// Author:zhang.zhanling
    /// 對TransactionScope,讓它(ta)對同一個數據庫不產(chan)生msdtc服務
    /// </summary>
    public class TransactionScopeNoMsdtc
    {
        /// <summary>
        /// 產(chan)生包裹事(shi)務
        /// </summary>
        /// <param name="db">數據(ju)上下(xia)文</param>
        /// <param name="isOutermost">是否為最外層,默認為false</param>
        /// <param name="action">處理代(dai)碼(ma)塊(kuai)</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)//如果是(shi)最外層事務,而將連接關閉
                    objectContext.Connection.Close();
            }
        }
        /// <summary>
        /// 產(chan)生(sheng)包裹事務,它(ta)不是最外層的,如果(guo)是最外層的需要調用其它(ta)重載
        /// </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();
            });

感謝閱讀!

回到目錄

posted @ 2013-12-03 11:17  張占嶺  閱讀(1733)  評論(0)    收藏  舉報