Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Exception in einer Stored proc hängt thread auf (https://www.delphipraxis.net/186705-exception-einer-stored-proc-haengt-thread-auf.html)

MyRealName 23. Sep 2015 19:17

Datenbank: Firebird • Version: 2.5.4 • Zugriff über: DBX

Exception in einer Stored proc hängt thread auf
 
Hallo,

habe ein seltsames Problem und hab bisher keine richtige Lösung gefunden im Internet.
Ich für über eine DBX Verbindung eine Stored Proc in einer firebird DB aus. Wenn dort eine Exception ausgelöst wird, dann hängt die scheinbar den ganzen Thread auf, er kommt aus dem TSQLStoredProc.ExecSQL nicht mehr raus, geht aber auch nicht in den exception handler rein :(

Code:
    try
      SP_DOC_QUEUE_PROCESS.Close;
      SP_DOC_QUEUE_PROCESS.ParamByName('Id').AsInteger := Id;
      SP_DOC_QUEUE_PROCESS.ExecProc; // <--- hier hängt er bei einer exception
      If SP_DOC_QUEUE_PROCESS.ParamByName('Error_Code').AsInteger <> 0 Then
        Raise EDatabaseError.Create('ErrorCode: ' + SP_DOC_QUEUE_PROCESS.ParamByName('Error_Code').AsString
                + #13#10 + Trim(SP_DOC_QUEUE_PROCESS.ParamByName('Error_Msg').AsString));
      DBConnection.CommitFreeAndNil(TD);
      RemoveFromQueue(Id);
      QR.Close;
      QR.SQL.Text := 'SELECT COUNT(Id) FROM Doc_Queue';
      QR.Open;
      FbDoCheckQueue := (QR.Fields[0].AsInteger > 0);
      DocsInCola := QR.Fields[0].AsInteger;
      QR.Close;

      DoInformProcessDone(Clase, E, S, Tipo, Numero, TipoOp, DocsInCola); // sends message to mainthread
    except
      on Ex: Exception do begin
        DBConnection.RollbackFreeAndNil(TD);
        CodeSite.Send(csmLevel1, 'Error processing document', Ex.Message);
        Inc(CE);
        If CE >= 5 Then begin
          CreateNotification(E, S, Tipo, Numero, UserId, TipoOp, Ex.Message);
          RemoveFromQueue(Id);
          DoNotifyUserError(UserId, Ex.Message);
        end else begin
          RemoveFromQueue(Id);                                            // remove it from the first place
          InsertIntoQueue(E, S, Tipo, Numero, TipoOp, UserId, CE, RC);    // and insert it at the end again
        end;
        FbDoCheckQueue := True;
      end;
Die exception ist zum Bsp ein Lock Conflict, etwas was man nicht wirklich umgehen kann.

Hat einer eine Idee warum DBX nicht mehr zurück kommt ?

Danke schonmal im vorraus

tsteinmaurer 24. Sep 2015 07:48

AW: Exception in einer Stored proc hängt thread auf
 
Hi,

Ist deine Anwendung multi-threaded?
Wie sieht die Stored Procedure aus?

Thomas

MyRealName 24. Sep 2015 13:40

AW: Exception in einer Stored proc hängt thread auf
 
Die App ist multi-threaded, die stored proc ist etwas komplizierter, da es eine zentrale stored proc ist die je nach daten andere Sachen macht und andere Stored procs aufruft.
UNd es funktioniert auch alles, solange keine exception passiert scheinbar.
Bei UniDAC habe ich das immer so mit dem Try/Except gemacht und da wird die exception der DB auch entsprechend i Except block ausgelöst. Aber UniDAC hat scheinbar Probleme beim aufräumen, wenn man mehrere Threads macht mit eigenen TUniConnection-Komponenten. Deswegen hatte ich die gegen DBX Getauscht, weil da geht es.

MyRealName 24. Sep 2015 22:09

AW: Exception in einer Stored proc hängt thread auf
 
Habs rausgefunden, meine DBX Verbinfung macht eine WAIT_TRANSACTION auf, dadurch wartet das ExecSQL bei einem Lock conflict, wenn ich es als NOWAIT_TRANSACTION definiere (wo ich noch nicht weiss, wie), dann schmeisst Firebird den Fehler gleich.

Danke an alle, die zumindest drüber machgedacht haben
MRN


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz