欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#分布式事務的超時處理實例分析

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

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

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

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

比如:

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

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

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

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

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

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

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

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

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

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

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

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

相關文章

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

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

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

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

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

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

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

    c# 網址壓縮簡單實現(xiàn)短網址

    短網址,忽然一下子就冒出來的東西,長長的一個URL,提交過去,出來就只有短短的一個URL了,看起來似乎挺神奇,其實簡單分析一下,明白其中的原理,也是一件很簡單的事情,需要的朋友可以了解下
    2012-12-12
  • c# 開機啟動項的小例子

    c# 開機啟動項的小例子

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

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

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

    C#單位轉換器簡單案例

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

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

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

    C#中的串口通信SerialPort詳解

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

    C# dump系統(tǒng)lsass內存和sam注冊表詳細

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

最新評論