Warum bin ich immer diese Fehlermeldung plötzlich?

Also ich habe einen WCF-Dienst, in dem es eine Process () - Methode. Diese Methode liest ein byte-array (eine Datei) aus einer Tabelle, und im Grunde stellt, dass die Daten aus dieser Datei in mehrere Tabellen. Es ist einfach durchläuft jede Zeile. Es war in Ordnung arbeiten seit einem Monat in der Produktion. Jetzt plötzlich, wirft er diesen Fehler nur zeitweise:

System.InvalidOperationException: Die Transaktion im Zusammenhang mit der aktuellen Verbindung beendet hat, aber noch nicht entsorgt wurden. Die Transaktion muss entsorgt werden, bevor die Verbindung verwendet werden kann zum ausführen von SQL-Anweisungen.

Etwas, das helfen könnte:
Über 2 Wochen haben wir geändert, aus der Produktion von web - & DB-Server. Dieser Fehler wurde, werfen erst, nachdem wir uns umgezogen. Ich habe nicht begegnet diesem problem, wenn wir auf dem Alten Server. Aber die Sache ist, dieser Fehler nicht auftreten, in den ersten 9-10 Tagen. Nun passiert es plötzlich und stoßweise. Ich habe hochgeladen von großen Dateien (1k-2,5 k Zeilen) und Sie haben funktioniert, und dieser Fehler wirft für wesentlich kleinere Dateien, die 200 Zeilen! Und die Service-Prozesse die gleiche Datei perfekt manchmal.

Code-snippet: (es ist viel größer, aber ähnliche Vorgänge wiederholt werden)

using (var scope = new TransactionScope())
{
    //loop through each row/invoice
    foreach (var row in Rows)
    {
        Invoice invoice = (Invoice)CreateObjectWithConstantData(typeof(Invoice), doc, applicationName);
        invoice = (Invoice)FillObjectWithUserData(invoice, row, -1, -1, string.Empty);
        invoice.InvoiceNumber = InvoiceDBImpl.SaveInvoice(invoice, processFileRequest.RunId);

        if (invoice.InvoiceNumber == Guid.Empty)
        {
            throw new DataAccessException(string.Format(Messages.ErrorSavingInvoice, invoice.ReceiptId, invoice.ProductID));
        }
    }
}

Einem der Stack-Traces:

   at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)
   at Tavisca.TramsFileService.DataAccess.TramsDBDataContext.SaveTramsPayment(Nullable`1 paymentDate, String paymentType, Nullable`1 totalAmount, String bankAccount, String paymentMethod, String branch, String remarks, String creditCardLast4, String payeeName, String profileNumber, Nullable`1& paymentId)
   at Tavisca.TramsFileService.DataAccess.PaymentDBImpl.<>c__DisplayClass1.<SavePayment>b__0(TramsDBDataContext dc)
   at Tavisca.TramsFileService.DataAccess.SystemDataContext.PerformOperation(Action`1 action)
   at Tavisca.TramsFileService.DataAccess.PaymentDBImpl.SavePayment(Payment payment)
   at Tavisca.TramsFileService.Core.TramsFileController.ProcessFile(ProcessFileRQ processFileRequest)
   at Tavisca.TramsFileService.ServiceImplementation.TramsFileServiceImpl.ProcessFile(ProcessFileRQ processFileRequest)

Ich habe durch einige links:

  1. Link 1
  2. Link 2
  3. Link 3

Alle Sie schlagen die Erhöhung des Zeitlimits auf der Maschine.config, aber ich bin mir nicht sicher, warum es funktioniert manchmal und funktioniert nicht, die anderen Male. Sollte dies nicht konsequent sein?

Klingt wie es war ein Fehler, das zerstört die Transaktion. Sind Sie sicher, dass Sie wissen kein solcher Fehler aufgetreten ist? Ich sehe oft Leute schlucken Ausnahmen.
Oder etwas, was als Complete-Methode vorzeitig. Könnte das sein?
Ich habe Protokolle für den service..und wenn ich überprüft die Protokolle, es war kein Fehler dieser Art überhaupt bis vor kurzem. In jüngster Zeit gab es mehrere Instanzen mit dem gleichen Fehler
Ich denke, ich habe, was du meintest. Ich habe einen block für meine Transaktion, und am Ende des Blocks habe ich Transaktion.Coplete(). In der Mitte, ich habe code zu werfen Fehler, wenn etwas nicht gesichert werden konnten. Könnte es sein, dass es wirft einen Fehler beim speichern und die Transaktion wird keinen Rollback?
In meiner Erfahrung diese Meldung bedeutet, dass dies passiert: try { ExecuteSqlThatFails(); } catch { } ExecuteNextSQL();. Der erste Fehler tötet die trans aber Sie schlucken ihn, so dass Sie nie herausfinden. Die nächste SQL läuft unter den gescheiterten .NET tran ohne SQL-Server-tran. Es ist unmöglich, das Problem zu beheben, ohne dass der code, der das problem verursacht.

InformationsquelleAutor karan k | 2014-06-15

Schreibe einen Kommentar