2009-04-13 3 views
1

mir bitte helfen, dieses Problem zu beheben:Transaktion Timeout abgelaufen, während Linq2Sql DataContext.SubmitChanges mit()

Es ist eine Ambient-MSMQ-Transaktion. Ich versuche, eine neue Transaktion für die Protokollierung zu verwenden, aber beim Versuch, Änderungen zu senden, den nächsten Fehler zu erhalten - "Timeout abgelaufen. Das Zeitlimit ist vor dem Abschluss des Vorgangs abgelaufen oder der Server antwortet nicht." Hier ist Code:

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

Bitte helfen Sie mir. Thx.

Antwort

1

Sie könnten das Timeout erhöhen oder alles zusammen eliminieren.

Etwas wie:

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

Vorsicht

+0

danke. Aber diese Lösung stellt eine neue Frage - wenn der Transaktionsumfang geändert wurde, warum die Operation so zeitaufwendig wird? Datenbank und Anwendung befinden sich auf demselben Computer. – spkenny

+1

Ich habe nicht genug Informationen, um diese Frage zu beantworten. Sie können den SQL Profiler verwenden, um zu sehen, was hinter den Kulissen passiert. Viel Glück. – billb

1

Sie sagte:

Ihnen danken. Aber diese Lösung stellt eine neue Frage - wenn der Transaktionsumfang geändert wurde, warum die Operation so zeitaufwendig wird? Datenbank und Anwendung sind auf der gleichen Maschine

Das ist, weil Sie neue Datacontext genau dort schaffen:

TransactionLogDataContext transactionDC = new TransactionLogDataContext()) 

Mit neuen Datenkontext ADO.NET eröffnet neue Verbindung (auch wenn Verbindungszeichenfolgen sind die Gleiches, es sei denn, Sie machen ein cleveres Verbindungs-Pooling). Im Transaktionskontext, wenn Sie versuchen, mit mehr als 1 Verbindungsinstanzen zu arbeiten (was Sie gerade getan haben) ADO.NET fördert automatisch die Transaktion zu einer verteilten Transaktion und versucht, sie in MSDTC einzutragen. Die erste Transaktion pro Verbindung in MSDTC zu erfassen dauert einige Zeit (für mich dauert es 30+ Sekunden), aufeinanderfolgende Transaktionen sind jedoch schnell (in meinem Fall 60ms). Werfen Sie einen Blick auf diese http://support.microsoft.com/Default.aspx?id=922430

Was Sie tun können, ist Transaktion und Verbindungszeichenfolge (wenn möglich) wiederverwenden, wenn Sie neue DataContext erstellen.

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

Wo ExistingDataContext derjenige ist, der Ambient-Transaktion gestartet wurde.

Oder versuchen Sie, Ihren MS DTC zu beschleunigen.

Verwenden Sie auch SQL Profiler von Billb vorgeschlagen und suchen Sie nach SessionId zwischen verschiedenen Befehlen (Speichern und Savelog in Ihrem Fall). Wenn sich SessionId ändert, verwenden Sie tatsächlich zwei verschiedene Verbindungen und müssen in diesem Fall die Transaktion erneut verwenden (wenn Sie nicht möchten, dass sie auf MS DTC hochgestuft wird).