亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

比如:

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

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

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

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

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

或者在using的時(shí)候就定義好超時(shí)時(shí)間:

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

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

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

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

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

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

相關(guān)文章

  • C#實(shí)現(xiàn)文件篩選讀取并翻譯的自動(dòng)化工具

    C#實(shí)現(xiàn)文件篩選讀取并翻譯的自動(dòng)化工具

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)文件篩選及讀取內(nèi)容,并翻譯的自動(dòng)化工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03
  • c# 實(shí)現(xiàn)觀察者模式

    c# 實(shí)現(xiàn)觀察者模式

    這篇文章主要介紹了c# 實(shí)現(xiàn)觀察者模式的步驟,幫助大家更好的理解和使用c#實(shí)現(xiàn)設(shè)計(jì)模式,感興趣的朋友可以了解下
    2021-01-01
  • Unity查找游戲物體的六種方式詳解

    Unity查找游戲物體的六種方式詳解

    最近學(xué)習(xí)unity3d做游戲,總結(jié)了一些實(shí)用的內(nèi)容,所以下面這篇文章主要給大家介紹了關(guān)于Unity查找游戲物體的六種方式,需要的朋友可以參考下
    2021-06-06
  • c# 網(wǎng)址壓縮簡(jiǎn)單實(shí)現(xiàn)短網(wǎng)址

    c# 網(wǎng)址壓縮簡(jiǎn)單實(shí)現(xiàn)短網(wǎng)址

    短網(wǎng)址,忽然一下子就冒出來(lái)的東西,長(zhǎng)長(zhǎng)的一個(gè)URL,提交過(guò)去,出來(lái)就只有短短的一個(gè)URL了,看起來(lái)似乎挺神奇,其實(shí)簡(jiǎn)單分析一下,明白其中的原理,也是一件很簡(jiǎn)單的事情,需要的朋友可以了解下
    2012-12-12
  • c# 開機(jī)啟動(dòng)項(xiàng)的小例子

    c# 開機(jī)啟動(dòng)項(xiàng)的小例子

    c# 開機(jī)啟動(dòng)項(xiàng)的小例子,需要的朋友可以參考一下
    2013-03-03
  • 利用多線程句柄設(shè)置鼠標(biāo)忙碌狀態(tài)的實(shí)現(xiàn)方法

    利用多線程句柄設(shè)置鼠標(biāo)忙碌狀態(tài)的實(shí)現(xiàn)方法

    怎樣利用多線程句柄設(shè)置鼠標(biāo)忙碌狀態(tài)呢?下面小編就為大家介紹一下具體的實(shí)現(xiàn)方法吧!需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • C#單位轉(zhuǎn)換器簡(jiǎn)單案例

    C#單位轉(zhuǎn)換器簡(jiǎn)單案例

    這篇文章主要為大家詳細(xì)介紹了C#單位轉(zhuǎn)換器簡(jiǎn)單案例,一個(gè)簡(jiǎn)單的winform應(yīng)用程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • ScriptControl控件執(zhí)行自定義VBS腳本示例分析

    ScriptControl控件執(zhí)行自定義VBS腳本示例分析

    這篇文章主要介紹ScriptControl控件 msscript.ocx msscript.oca執(zhí)行自定義VBS腳本的示例代碼,需要的朋友可以參考下
    2013-04-04
  • C#中的串口通信SerialPort詳解

    C#中的串口通信SerialPort詳解

    今天這篇文章帶大家學(xué)習(xí)下C#中的串口通訊。在日常的開發(fā)工作中,如果工作內(nèi)容是CS方向的同學(xué)應(yīng)該很容易接觸到串口通訊方面的業(yè)務(wù)需求。那么也就很容易想到C#中SerialPort類,它就是專門來(lái)處理串口通訊相關(guān)的
    2022-01-01
  • C# dump系統(tǒng)lsass內(nèi)存和sam注冊(cè)表詳細(xì)

    C# dump系統(tǒng)lsass內(nèi)存和sam注冊(cè)表詳細(xì)

    這篇文章主要介紹了C# dump系統(tǒng)lsass內(nèi)存和sam注冊(cè)表,在這里選擇 C# 的好處是體積小,結(jié)合 loadAssembly 方便免殺,希望對(duì)讀者們有所幫助
    2021-09-09

最新評(píng)論