2017-01-27 28 views
0

我不能修改客戶端的TransactionScope超時最多隻有10分鐘

在machine.config中是否有嵌套事務其他任何方式爲他們持續更長的時間超過10分鐘?隔離級別或其他選項是否有助於解決超時問題。我在DoWork()內的交易很好​​,我認爲這是外部交易超時。

private void DoAllWork() 
{ 
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TransactionManager.MaximumTimeout)) 
    { 
     DoWork(); 
     scope.Complete(); 
    } 
} 
private void DoWork() 
{ 
    Foreach(Some long running loop) 
    { 
     using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TransactionManager.MaximumTimeout)) 
     { 
      // Entity Framework queries/modification/Save Changes 
      scope.Complete(); 
     } 
    } 
} 

回答

0

我有同樣的問題。您需要在machine.config中更改它。這些設置不起作用。但改變machine.config是不好的,所以我解決了這個問題。我在做什麼是在運行時獲取事務管理器對象,並更新它的值,它適用於我。

public TransactionScope CreateTransactionScope(TimeSpan timeout) 
    { 
     SetTransactionManagerField("_cachedMaxTimeout", true); 
     SetTransactionManagerField("_maximumTimeout", timeout); 

      var transactionScopeOptions = new TransactionOptions 
      { 
       IsolationLevel = IsolationLevel.ReadUncommitted, 
       Timeout = timeout 
      }; 

     return new TransactionScope(TransactionScopeOption.RequiresNew, transactionScopeOptions); 
    } 


     private void SetTransactionManagerField(string fieldName, object value) 
    { 
     typeof(TransactionManager).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, value); 
    } 

我用它像這樣

  using (var scope = CreateTransactionScope(TimeSpan.FromMinutes(50))) 
      { 
     // do something 
     scope.Complete(); 


     } 
     catch (Exception e) 
     { 
      new Logger().LogException(e); 


     } 
+0

這是怎麼回事永遠堅持新的值或者它只是有效,直到scope.complete() – mehwish

+0

喜@mehwish的示例代碼顯示如果你已經完成了所有的數據庫工作,並且想要堅持你需要的所有設置scope.complete的內容,除非它不能保存。 –

+0

它的一種說法,一切都很好,以便事務可以完成 –