程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#散布式事務的超時處置實例剖析

C#散布式事務的超時處置實例剖析

編輯:C#入門知識

C#散布式事務的超時處置實例剖析。本站提示廣大學習愛好者:(C#散布式事務的超時處置實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#散布式事務的超時處置實例剖析正文


本文實例講述了C#散布式事務的超時處置的辦法。分享給年夜家供年夜家參考。詳細剖析以下:

事務是個很精巧的存在,我們在數據層、辦事層、營業邏輯層等多處處所都邑應用到。

在這裡我只說下TransactionScope這個微軟推舉應用的隱式事務。它是從Framework 2.0開端引入的一個事務治理類,在應用隱式事務時,事務完成前 法式應挪用TransactionScope的Complete()辦法,將事務提交,然後應用Dispose()釋放事務對象。若履行時代湧現毛病,事務將主動回滾。

好比:

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

在這裡小我建議用using來創立,由於using完成了IDispose接口,它會隱式的挪用TransactionScope對象的Dispose辦法,即便產生異常時也是如斯,能確保在事務停止或許異常的時刻也能准確的釋放資本。其實我們反編譯一下,它的外部完成就是一個try...finally代碼塊,如許也就不難懂得using的感化了。

說主題,在某地市的某庫進級中,為防止法式運轉中發生髒數據和數據更新紛歧致招致的反復同步情形,在能夠發生上述成績的斟酌下,我用這個TransactionScope來對上述的操作停止事務處置。在本機的測試情況中,運轉成果是正常的,固然這個運轉正常的條件是數據量較小的情形下,我每次只對一條或許十幾條數據的分歧表停止insert和update。但是安排到臨盆情況針對真實數據運轉以後,發明這個事務老是回滾,一向沒法正常提交。法式也就沒法正常跑起來。由於臨盆情況中的數據有60W閣下,insert一次、update一次,最初再insert一條同步語句,前2個操作都是比擬耗時的。我切換回測試情況調試了一下,逐交運行,發明當履行完第一個insert以後,履行第二個update時產生異常了。這個異常由TransactionScope拋出,異常提醒是:事務已中斷。這個毛病,在數據量小的情形下不會產生,數據量年夜一些就湧現了,這個是否是和事務處置的時光長短有關呢?由於我顯著感到到在此次調試的時刻,履行的時光比之前數據量只要一條的時刻長了許多,至多消費1分鐘以上。因而谷歌一下,驗證了我的設法主意。

TransactionScope有些重載函數是可以接收TimeSpan類型的值,這個就是事務的超不時間了。當事務虛現隔離的時刻,事務規模內的資本將會被鎖定,假如一些事務歷久占領資本,那將很輕易形成逝世鎖,為了不這個成績,TransactionScope事務會界說一個超時限制,這個超時默許值為60秒。假如事務跨越此時光,即便沒有產生異常,也會主動中斷。下面成績的緣由算是找到了,曉得了緣由,那末也就很好處理了。我們可以在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分鐘,其實全部進程處置起來也就第一次處置汗青數據須要1到2分鐘時光,今後天天只需處置幾十條數據,這個時光根本是秒級其余。

這裡解釋下, 超不時間假如設置為0時表現超時無窮長。無窮長的設置重要對換試有效,調試進程中能夠要慢慢經由過程代碼來隔離營業邏輯中的成績,而且在測驗考試肯定成績時代不願望所調試的事務超時。在一切其他情形下應用無窮長的超不時必定要非分特別當心,由於它會籠罩避免事務逝世鎖的掩護。

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved