IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Firedac + SQlite => erreur incomprise : interrupted


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut Firedac + SQlite => erreur incomprise : interrupted
    Bonjour

    J'ai une application 'server" datasnap rest qui gère une base de données SQlite.
    Plusieurs applications clientes se connectent à cette application server pour obtenir ou envoyer des données.
    Un des services plante de façon aléatoire avec le message

    [Firedac][Phys][SQlite] ERROR: interrupted

    Le fichier de données fait environ 1 GO mais n'est pas corrompu.
    Les requêtes faites dans la procédure sont tout à fait raisonnables.

    Impossible de déboguer vu que c'est totalement aléatoire.

    A votre avis, quel genre de problème pourrait provoquer l'erreur ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    des pistes à défaut, mais que tu as peut être déjà
    indicates that an operation was aborted prior to completion, usually be application request.

    If the callback function to sqlite3_exec() returns non-zero, then sqlite3_exec() will return SQLITE_ABORT.

    If a ROLLBACK operation occurs on the same database connection as a pending read or write, then the pending read or write may fail with an SQLITE_ABORT or SQLITE_ABORT_ROLLBACK error.

    In addition to being a result code, the SQLITE_ABORT value is also used as a conflict resolution mode returned from the sqlite3_vtab_on_conflict() interface.
    plus de détails https://www.sqlite.org/rescode.html#abort

    reste à savoir ce que fait le service
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    reste à savoir ce que fait le service
    Il reçoit un contenu JSON, le décortique pour remplir ou mettre à jour 3 tables de données et renvoie un JSON contenant un code de réussite ou d'erreur selon le résultat.
    Tout est dans une transaction avec un joli try..except autour.
    L'erreur est d'ailleurs renvoyée dans le JSON renvoyé par le service, preuve que le try..except fait bien son boulot.
    A l'origine, je vérifiais juste une exception générique mais je viens de rajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        on E:EFDDBEngineException do
        begin
          FDConnection1.Rollback;
          Writer.WritePropertyName('error');
          for I := 0 to E.ErrorCount - 1 do
          begin
            Errs := Errs + E.Errors[I].Message;
            if I < (E.ErrorCount - 1) then
              Errs := Errs + sLineBreak;
          end;
          Writer.WriteValue('SetRecord: ' + Errs);
        end;
    histoire d'avoir un peu plus de détails la prochaine fois.

    Ce qui me fait un peu flipper (si tant est que j'ai bien compris les implications) c'est la phrase :

    If a ROLLBACK operation occurs on the same database connection as a pending read or write, then the pending read or write may fail with an SQLITE_ABORT or SQLITE_ABORT_ROLLBACK error.
    Dans une utilisation mono-utilisateur, je n'ai jamais eu ce problème.
    Il apparaît que ça arrive seulement en multi-utilisateurs.
    Et je vais avoir du mal à baliser ça si le c'est la source du problème.:(

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Dans une utilisation mono-utilisateur, je n'ai jamais eu ce problème.
    Il apparaît que ça arrive seulement en multi-utilisateurs.
    Oui la phrase est peut être mal formulée aussi
    Pour moi effectivement SQLite c'est du mono-utilisateur quoique :
    Multiple processes can have the same database open at the same time. Multiple processes can be doing a SELECT at the same time. But only one process can be making changes to the database at any moment in time, however.
    Il y a aussi une option WAL

    Mais même mono-utilisateur ne veux pas forcément dire mono-transaction, imaginons par exemple des accès et actions dans des threads je laisse imaginer ce qui peut se produire
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Tu sais que tu peux mettre en oeuvre le moniteur Firedac pour tracer le problème. Si besoin Je peux t'envoyer un exemple.
    Ne pas oublier de passer la connection en Mode "Normal"

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Ah je veux bien un exemple pour monitorer sqlite.
    Je connaissais des utilitaires pour SQLServer mais pas pour SQLite.

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Ci-joint exemple avec base SQL LIte changer le chemin d'accès à la base.
    Ouvrir l'outil Moniteur Firedac
    Exécuter le programme ci-joint.
    Données significatives dans le FMX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      object FDConnection1: TFDConnection
        Params.Strings = (
          'Database=c:\data\bddfact.db'
          'LockingMode=Normal'
          'DriverID=SQLite'
          'MonitorBy=Remote')
        Connected = True
        LoginPrompt = False
      end
      object FDMoniRemoteClientLink1: TFDMoniRemoteClientLink
        Tracing = True
      end
    BDDFMX.zip

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    Merci ! C'est récupéré.
    Je regarde ça dans la journée.

Discussions similaires

  1. PLS-00103 erreur incomprise sur PL/SQL developer
    Par balkis dans le forum PL/SQL
    Réponses: 5
    Dernier message: 01/09/2010, 16h03
  2. Réponses: 4
    Dernier message: 21/09/2007, 16h37
  3. Erreur incomprise sur le d_type
    Par lowboy dans le forum C
    Réponses: 7
    Dernier message: 22/07/2007, 10h42
  4. [FPDF] erreur incomprise
    Par oceane751 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/01/2007, 00h20
  5. Erreur incomprise avec DBI et perl
    Par duedos dans le forum SGBD
    Réponses: 3
    Dernier message: 04/07/2006, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo