2017-01-27 6 views
0

ich nicht in der Lage bin, die machine.config auf dem ClientTransaction Timeout max ist nur 10 Minuten

Gibt es eine andere Art und Weise in verschachtelten Transaktionen zu ändern, um sie länger als 10 Minuten zu dauern? Ist die Isolationsstufe oder eine andere Option hilfreich bei der Zeitüberschreitung? Meine Transaktion innerhalb DoWork() ist in Ordnung, ich denke, es ist die äußere Transaktion, die Zeitüberschreitung ist.

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(); 
     } 
    } 
} 

Antwort

0

Ich hatte das gleiche Problem. Sie müssen es in machine.config ändern. Diese Einstellung funktioniert nicht. Aber das Ändern von machine.config ist nicht gut, also habe ich es so gelöst. Was ich mache, ist, das Transaktions-Manager-Objekt zur Laufzeit zu bekommen und seinen Wert zu aktualisieren, und es funktioniert für mich.

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); 
    } 

und ich verwende es wie diese

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


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


     } 
+0

wird dies für immer den neuen Wert beharren geht oder ist es nur gültig bis zum scope.complete() – mehwish

+0

hallo @mehwish der Beispielcode ist zu zeigen, Sie, wenn Sie mit all Ihren db Sachen fertig sind und alles, was Sie brauchen, um scope.complete setzen zu können, wenn es nicht speichern wird. –

+0

seine Art zu sagen, dass alles in Ordnung ist, so dass die Transaktion –

Verwandte Themen