天天看點

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

本地事務:這個沒什麼好說了,就是單個事務,每種資料庫都有自己的實作,事務的深度内涵可以搜尋檢視相關的文章,不是本文介紹的重點。

分布式事務,需要添加引用system.transactions,同時啟用msdtc分布式事務服務:通常使用方式為:

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

 using (system.transactions.transactionscope ts = new system.transactions.transactionscope())

 {

                //代碼塊a

                //代碼塊b

                ts.complete();//送出事務

 }

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

分布式事務本質上是引入了第三方裁判,來想辦法對多個本地事務監控同時成功或同時失敗,這裡分享幾個知識點:

a:如果代碼塊裡,若存在兩個或以上資料庫連結dbconnection,則需要啟動微軟的msdtc分布式事務服務。

用指令行啟動或停止服務:

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

b:如果代碼塊裡,隻有一個資料庫連結dbconnection,那麼實際上隻是本地事務在處理,就算msdtc分布式事務服務沒啟動,也不會報錯。

c:對于transactionscope包含的代碼塊,本質是監控了代碼塊裡資料庫連結dbconnection的個數,如果有多個不同的對象,則引入msdtc當裁判,而實際執行的事務的還是各個本地事務。

d:msdtc總是不夠穩定,我在測試時兩個簡單的事務一起時,按住f5不停重新整理,竟然能把mssql服務也給挂了,而用本地事務就算跨庫也不會有問題。

是以,不是必須的情況,盡量不要引入分布式事務,應該避免使用transactionscope來包含事務塊的沖動。 

問題:一個代碼塊裡n個實體類雜交操作,每個實體類帶有各種的資料庫連結,進而引發了msdtc。

可以:共用一個dbconnection對象,來避免啟用msdtc。

每種資料庫有自己的解決方式:像mssql,跨庫處理隻要加字首(dbname..tablename)就可以,是以也使的隻使用本地事務就可以處理了。

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

實體類項目,工廠項目,接口項目,資料操作,還有大量的增删改查存儲過程,隻是為了基礎的增删改查而且隻針對mssql。

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

随便展開一個項目都會看到大量的檔案夾,裡面有大量的檔案,而這些東東,都是代碼生成器的傑作:

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:
事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:
事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

19個資料庫啊,nn個表,光生成這些基本的增删改查,整個項目就好像高端大氣上檔次了。

對于生成的大量的實體,每個表的操作都是一個新的連結,單庫間的事務都必須msdtc了,更别說19個庫間的跨庫事務了。

為了消滅上述的那些大量的生成檔案,我在後續新的公司寫了傳統的orm架構:xqdata(這個架構一直沒露過面,也隻是支援mssql,用反射消滅了好多層,隻留下實體層)。

對于架構的演進,多數都來源于項目中遇到的問題,或複雜的場景,需要解決或者簡化,才有了不斷更新的可能,并不是無中生有,是以,一個架構,如果不能不斷在在項目中實戰,那麼很多問題和細節等可能都無法發現,更新也會遙遙無期。 

而cyq.data的不斷更新,說明我一直在奮戰在一線的編碼生涯中和網友各大項目中的實戰回報中。 

下面針對最近的優化調整,示範下cyq.data是怎麼解決上面提到的幾個問題:

a:先用配置工具生成針對多資料庫的枚舉檔案,和成demo和test兩個資料庫:

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

兩個資料庫就生成兩次了。

b:配置一個預設的連結字元串,到demo資料庫:

<add name="conn" connectionstring="server=.;database=demo;uid=sa;pwd=123456"/>

c:列印操作test資料庫表的連結字元串:

using (maction action = new maction(testenum.users))

            {

                console.writeline(action.connectionstring);

            }

輸出:

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:
事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

            appdebug.opendebuginfo = true;

            appdebug.start();

            using (maction action = new maction(demoenum.users))

                 action.begintransation();//開啟事務

                 action.fill(12);

                console.writeline(action.connectionstring);//列印資料庫連結

                action.resettable(testenum.users);//切換資料庫

                action.fill(12);

                action.endtransation();

            console.writeline(appdebug.info);//輸出所有執行的sql語句。

            appdebug.stop();

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

輸出的結果:

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

如果注釋掉代碼中的事務,則是直接切換資料庫連結,輸出會如下圖:

事務使用中如何避免誤用分布式事務(System.Transactions.TransactionScope)1:本地事務DbTransaction和分布式事務TransactionScope的差別: 2:可以用本地事務解決,避免使用分布式事務場景:3:回顧下我以前的項目場景:4:CYQ.Data 提供的解決方案: 總結:

對于.net領域,微軟除了提供這個不太穩定的msdtc,似乎沒有發現其它分布式事務的解決方案,好在一般的項目,我們在本地事務就可以處理。

希望微軟可以在一些重點分布式上多做點研究、普及和推廣,提供分布式相關項目的解決方案,别整天操碎心在那些簡單的增删改查上。

本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/p/3554510.html