2009-04-13 50 views
1

請幫我解決此問題:使用Linq2Sql時,事務超時過期DataContext.SubmitChanges()

存在環境MSMQ事務。我試圖使用新事務進行日誌記錄,但在嘗試提交更改時出現下一個錯誤 - 「超時已過期,操作完成之前超時時間已到或服務器沒有響應。」這裏是代碼:

public static void SaveTransaction(InfoToLog info) 
    { 
     using (TransactionScope scope = 
      new TransactionScope(TransactionScopeOption.RequiresNew)) 
     { 
      using (TransactionLogDataContext transactionDC = 
         new TransactionLogDataContext()) 
      { 
       transactionDC.MyInfo.InsertOnSubmit(info); 

       transactionDC.SubmitChanges(); 
      } 

      scope.Complete(); 
     } 
    } 

請幫幫我。 Thx。

回答

1

您可以考慮增加超時時間或將其全部消除。

喜歡的東西:

using(TransactionLogDataContext transactionDC = new TransactionLogDataContext()) 
{ 
    transactionDC.CommandTimeout = 0; // No timeout. 
} 

小心

+0

謝謝。但是這個解決方案會產生新的問題 - 如果事務範圍被改變了,爲什麼提交操作變得如此耗時?數據庫和應用程序在同一臺機器上。 – spkenny 2009-04-13 12:07:17

1

你說:

謝謝。但是這個解決方案會產生新的問題 - 如果事務範圍被改變了,爲什麼提交操作變得如此耗時?數據庫和應用程序在同一臺機器

那是因爲你正在創造新的DataContext在那裏上:

TransactionLogDataContext transactionDC = new TransactionLogDataContext()) 

隨着新數據的上下文ADO.NET開闢了新的連接(即使連接字符串是同樣,除非你做了一些聰明的連接池)。 當您嘗試使用多個連接實例(您剛剛完成)時,在事務上下文中 ADO.NET會自動將事務提升爲分佈式事務,並嘗試將它列入MSDTC。每次連接到MSDTC的首次事務處理需要花費時間(對我來說需要30多秒),然而連續的事務處理會很快(在我的情況下爲60ms)。看看這個http://support.microsoft.com/Default.aspx?id=922430

你可以做的是在創建新的DataContext時重用事務和連接字符串(如果可能的話)。

TransactionLogDataContext tempDataContext = 
     new TransactionLogDataContext(ExistingDataContext.Transaction.Connection); 
tempDataContext.Transaction = ExistingDataContext.Transaction; 

其中ExistingDataContext是啓動環境事務的環境事務。

或試圖加快你的MS DTC。

也可以使用billb建議的SQL Profiler查找不同命令之間的SessionId(在你的情況下保存和savelog)。如果SessionId更改,實際上您使用2個不同的連接,並且在這種情況下將不得不重用事務(如果您不希望將其升級到MS DTC)。