最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#分布式事務(wù)的超時處理實例分析

 更新時間:2015年03月30日 16:24:38   作者:碼農(nóng)小牛  
這篇文章主要介紹了C#分布式事務(wù)的超時處理,以實例形式較為詳細(xì)的分析了C#分布式事務(wù)的超時處理相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了C#分布式事務(wù)的超時處理的方法。分享給大家供大家參考。具體分析如下:

事務(wù)是個很精妙的存在,我們在數(shù)據(jù)層、服務(wù)層、業(yè)務(wù)邏輯層等多處地方都會使用到。

在這里我只說下TransactionScope這個微軟推薦使用的隱式事務(wù)。它是從Framework 2.0開始引入的一個事務(wù)管理類,在使用隱式事務(wù)時,事務(wù)完成前 程序應(yīng)調(diào)用TransactionScope的Complete()方法,將事務(wù)提交,然后利用Dispose()釋放事務(wù)對象。若執(zhí)行期間出現(xiàn)錯誤,事務(wù)將自動回滾。

比如:

using (ransactionScope scope = new TransactionScope())
{
    //to do something
    scope.Complete();
}

在這里個人建議用using來創(chuàng)建,因為using實現(xiàn)了IDispose接口,它會隱式的調(diào)用TransactionScope對象的Dispose方法,即使發(fā)生異常時也是如此,能確保在事務(wù)結(jié)束或者異常的時候也能正確的釋放資源。其實我們反編譯一下,它的內(nèi)部實現(xiàn)就是一個try...finally代碼塊,這樣也就不難理解using的作用了。

說主題,在某地市的某庫升級中,為避免程序運(yùn)行中產(chǎn)生臟數(shù)據(jù)以及數(shù)據(jù)更新不一致導(dǎo)致的重復(fù)同步情況,在可能產(chǎn)生上述問題的考慮下,我用這個TransactionScope來對上述的操作進(jìn)行事務(wù)處理。在本機(jī)的測試環(huán)境中,運(yùn)行結(jié)果是正常的,當(dāng)然這個運(yùn)行正常的前提是數(shù)據(jù)量較小的情況下,我每次只對一條或者十幾條數(shù)據(jù)的不同表進(jìn)行insert和update。然而部署到生產(chǎn)環(huán)境針對真實數(shù)據(jù)運(yùn)行之后,發(fā)現(xiàn)這個事務(wù)總是回滾,一直無法正常提交。程序也就沒法正常跑起來。因為生產(chǎn)環(huán)境中的數(shù)據(jù)有60W左右,insert一次、update一次,最后再insert一條同步語句,前2個操作都是比較耗時的。我切換回測試環(huán)境調(diào)試了一下,逐行運(yùn)行,發(fā)現(xiàn)當(dāng)執(zhí)行完第一個insert之后,執(zhí)行第二個update時發(fā)生異常了。這個異常由TransactionScope拋出,異常提示是:事務(wù)已中止。這個錯誤,在數(shù)據(jù)量小的情況下不會發(fā)生,數(shù)據(jù)量大一些就出現(xiàn)了,這個是不是和事務(wù)處理的時間長短有關(guān)呢?因為我明顯感覺到在這次調(diào)試的時候,執(zhí)行的時間比之前數(shù)據(jù)量只有一條的時候長了很多,至少花費(fèi)1分鐘以上。于是google一下,驗證了我的想法。

TransactionScope有些重載函數(shù)是可以接受TimeSpan類型的值,這個就是事務(wù)的超時時間了。當(dāng)事務(wù)實現(xiàn)隔離的時候,事務(wù)范圍內(nèi)的資源將會被鎖定,如果一些事務(wù)長期占有資源,那將很容易造成死鎖,為了避免這個問題,TransactionScope事務(wù)會定義一個超時限制,這個超時默認(rèn)值為60秒。如果事務(wù)超過此時間,即使沒有發(fā)生異常,也會自動中止。上面問題的原因算是找到了,知道了原因,那么也就很好解決了。我們可以在Web.Config 中配置:

<configuration>
 <system.transactions>
  <defaultSettings timeout="00:05:00" />
 </system.transactions>
</configuration>

或者在using的時候就定義好超時時間:

復(fù)制代碼 代碼如下:
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,
new TimeSpan(0, 5, 0)))

或者先初始化事物行為的附加信息,然后定義超時時間:

復(fù)制代碼 代碼如下:
TransactionOptions tOpt = new TransactionOptions();
tOpt.IsolationLevel = IsolationLevel.ReadCommitted;
//設(shè)置TransactionOptions模式
tOpt.Timeout = new TimeSpan(0, 5, 0);
// 設(shè)置超時時間為5分鐘
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, tOpt))

我這里定義的是5分鐘,其實整個過程處理起來也就第一次處理歷史數(shù)據(jù)需要1到2分鐘時間,以后每天只需處理幾十條數(shù)據(jù),這個時間基本是秒級別的。

這里說明下, 超時時間如果設(shè)置為0時表示超時無限長。無限長的設(shè)置主要對調(diào)試有用,調(diào)試過程中可能要逐步通過代碼來隔離業(yè)務(wù)邏輯中的問題,并且在嘗試確定問題期間不希望所調(diào)試的事務(wù)超時。在所有其他情況下使用無限長的超時時一定要格外小心,因為它會覆蓋防止事務(wù)死鎖的保護(hù)。

希望本文所述對大家的C#程序設(shè)計有所幫助。

相關(guān)文章

  • Base64編碼解碼原理及C#編程實例

    Base64編碼解碼原理及C#編程實例

    這篇文章主要介紹了Base64編碼解碼原理及C#編程實例,本文講解了Base64編碼由來、Base64編碼原理、C#編程實現(xiàn),需要的朋友可以參考下
    2014-10-10
  • C#實現(xiàn)根據(jù)銀行卡卡號判斷銀行名

    C#實現(xiàn)根據(jù)銀行卡卡號判斷銀行名

    這篇文章主要介紹了C#實現(xiàn)根據(jù)銀行卡卡號判斷銀行名,是從其他網(wǎng)友的java程序改編而來,有需要的小伙伴可以參考下。
    2015-07-07
  • C#基于COM方式讀取Excel表格的方法

    C#基于COM方式讀取Excel表格的方法

    這篇文章主要介紹了C#基于COM方式讀取Excel表格的方法,涉及C# COM組件的調(diào)用與Excel表格的使用技巧,需要的朋友可以參考下
    2016-07-07
  • C# 基于NPOI操作Excel

    C# 基于NPOI操作Excel

    最近遇到一個數(shù)據(jù)導(dǎo)入的需求,語言是.net framework 4.7的C#。但是,這次主要探討NPOI的體驗,原則就是向前兼容。所以采用.xls的支持。下面就來看看實現(xiàn)步驟
    2021-06-06
  • ItemsControl 數(shù)據(jù)綁定的兩種方式

    ItemsControl 數(shù)據(jù)綁定的兩種方式

    這篇文章主要介紹了ItemsControl 數(shù)據(jù)綁定的兩種方式,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#泛型約束的深入理解

    C#泛型約束的深入理解

    本篇文章是對C#中的泛型約束進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#中@字符d是個什么意思

    C#中@字符d是個什么意思

    這篇文章主要介紹了C#中@字符d是個什么意思?具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • C# 實現(xiàn)簡單打印的實例代碼

    C# 實現(xiàn)簡單打印的實例代碼

    C# 實現(xiàn)簡單打印的實例代碼,需要的朋友可以參考一下
    2013-03-03
  • C# 拼圖魔方小游戲

    C# 拼圖魔方小游戲

    這篇文章主要介紹了C# 拼圖魔方小游戲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評論

新巴尔虎右旗| 璧山县| 贵阳市| 广昌县| 沂南县| 朝阳县| 吴堡县| 东至县| 云南省| 横山县| 正阳县| 黔西| 岳池县| 庆阳市| 青岛市| 察隅县| 大兴区| 屯昌县| 天等县| 资源县| 武定县| 平利县| 石棉县| 资讯 | 和田县| 许昌县| 长岭县| 顺平县| 五家渠市| 泰安市| 漳浦县| 苗栗市| 潞西市| 甘孜县| 晋中市| 云南省| 方城县| 曲松县| 舟山市| 自治县| 大化|