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

Firebird Discussion :

Problème de générateur


Sujet :

Firebird

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut Problème de générateur
    Bonjour à toutes et tous
    Je me permets de venir vers vous pour exposer un problème que je rencontre depuis peu avec une base de données Firebird

    Envrionnement de production
    Moteur Base de données Firebird 2.5 installé en Super Classique sur un serveur Citrix (serveur virtualisé)
    Base de données hébergée sur ce même serveur volumétrie 10Go environ, 260 tables, aucune contrainte de clé primaire, ni clé étrangère

    Environnement applicatif
    Application client développée en Delphi XE6 (accès lient serveur) via FireDac, gestion manuelle des transactions
    Application exécutée sur 10 serveurs Citrix (environ 2 à 3 utilisateurs par serveur Citrix)
    Quelques pics de montée en charge mais rien de bien phénoménal

    Problématique
    L'application utilise un générateur Firebird pour obtenir une clé technique unique pour la base de données.
    Cette clé est ensuite insérée dans une table de données.
    L'obtention de la clé se fait via un composant FireDac procédure stockée qui invoque simplement la procédure stockée de la base qui incrémente le générateur de 1.

    Depuis quelque temps, je me rends compte que je peux me retrouver avec des doublons de clé, ce qui commence a mettre en péril l'intégrité de la base de données

    En mode deboggage, aucun souci et aucune reproductivité possible, le générateur renvoyé est toujours unique.

    Pistes de réflexion
    Mauvais paramétrage de Firebird (volume de cache,...)
    Temps de latence des serveurs Citrix
    Montée en charge excessive

    Si quelqu'un a déjà rencontré un problème similaire, ou simplement me donner des pistes de réflexion, je vous en remercie par avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 033
    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 033
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je n'ai jamais rencontré ce problème quoique l'environnement soit différent 1 serveur une vingtaine de clients.
    Je m'attendais plutôt à un problème du genre "trous" mais pas à un problème de doublons

    [QUOTE=mballasse;11069956]Bonjour à toutes et tous
    Je me permets de venir vers vous pour exposer un problème que je rencontre depuis peu avec une base de données Firebird

    aucune contrainte de clé primaire, ni clé étrangère
    là je trouve ça moins que contraignant !


    FireDac, gestion manuelle des transactions
    L'application utilise un générateur Firebird pour obtenir une clé technique unique pour la base de données.
    Cette clé est ensuite insérée dans une table de données.
    L'obtention de la clé se fait via un composant FireDac procédure stockée qui invoque simplement la procédure stockée de la base qui incrémente le générateur de 1.
    Jamais je n'aurais fait comme ça ! Les triggers de Firebird sont là pour ça, utiliser une procédure stockée pour incrémenter un générateur au sein de transactions gérées manuellement me parait un pari risqué.

    J'ajouterai dans les pistes un problème de transaction
    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
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 057
    Points
    19 057
    Par défaut
    Salut à tous.

    Citation Envoyé par mballasse
    aucune contrainte de clé primaire, ni clé étrangère
    Ce n'est pas trop la philosophie des SGBDR de ne pas utiliser des clefs primaires et étrangères.
    A l'origine, ce sont des fichiers Excel qui vous chargez dans FireBird ?

    Citation Envoyé par mballasse
    Depuis quelque temps, je me rends compte que je peux me retrouver avec des doublons de clé, ce qui commence à mettre en péril l'intégrité de la base de données
    Dois-je comprendre que ce problème n'existait pas avant. Qu'est-ce qui a changé depuis ?

    Je pense à un problème de transaction. Qu'est-ce que vous utilisez comme mode transactionnel ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,

    Je regarderai plutôt la nature et la méthode d'obtention de cette "clé technique unique".
    Si elle est effectivement obtenue depuis un générateur par la fonction gen_id(MonGene,1) et qu'aucune autre procédure ne vient modifier le générateur, peu importe que ce soit directement dans une requête SQL ou par l'intermédiaire d'une procédure stockée, le générateur est "hors transaction" (ou alors il y a un gros problème dans Firebird).

    André

  5. #5
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut à tous.


    Ce n'est pas trop la philosophie des SGBDR de ne pas utiliser des clefs primaires et étrangères.
    A l'origine, ce sont des fichiers Excel qui vous chargez dans FireBird ?


    Dois-je comprendre que ce problème n'existait pas avant. Qu'est-ce qui a changé depuis ?

    Je pense à un problème de transaction. Qu'est-ce que vous utilisez comme mode transactionnel ?

    @+
    Je ne peux pas ajouter de contraintes clé primaire clé étrangère

    Pour l'ancienneté du problème, je n'ai pas encore eu le temsp de regarder si cela se produisait avant, mais nous avons eu récemment une montée en charge de la volumétrie, qui pourrait expliquer ce phénomène
    Le mode transactionnel utilisé en ReadCommitted

  6. #6
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    [QUOTE=SergioMaster;11070002]Bonjour,

    je n'ai jamais rencontré ce problème quoique l'environnement soit différent 1 serveur une vingtaine de clients.
    Je m'attendais plutôt à un problème du genre "trous" mais pas à un problème de doublons

    Citation Envoyé par mballasse Voir le message
    Bonjour à toutes et tous
    Je me permets de venir vers vous pour exposer un problème que je rencontre depuis peu avec une base de données Firebird


    là je trouve ça moins que contraignant !



    Jamais je n'aurais fait comme ça ! Les triggers de Firebird sont là pour ça, utiliser une procédure stockée pour incrémenter un générateur au sein de transactions gérées manuellement me parait un pari risqué.

    J'ajouterai dans les pistes un problème de transaction
    Bonjour Sergio
    Je ne peux pas utiliser de trigger dans la mesure où dans certains cas je dois récupérer la clé renvoyée pour définir une relation maitre détail.
    Auriez vous du coup un exemple de mise en place a me proposer

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 057
    Points
    19 057
    Par défaut
    Salut mballasse.

    Citation Envoyé par mballasse
    Je ne peux pas ajouter de contraintes clé primaire clé étrangère
    Pourquoi ?

    Citation Envoyé par mballasse
    Je ne peux pas utiliser de trigger dans la mesure où dans certains cas je dois récupérer la clé renvoyée pour définir une relation maitre détail.
    Un exemple détailé de ce que vous ne savez pas faire serait bienvenue.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    L'impossibilité de mettre en place des clés primaires et étrangères est imposée par un mécanisme de réplication multi sites (vieux de plus de 20 ans et qui fonctionne parfaitement) qui fonctionne en XML

    La question cocnernnat l'exemple est pour répondre à la problématique de l'appel via TRIGGER, je sais très bien faire fonctionner des relations maitre-détail via Delphi et Firedac, mais cela était pour répondre à la suggestion de SergioMaster

  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonjour,

    Citation Envoyé par mballasse Voir le message
    L'obtention de la clé se fait via un composant FireDac procédure stockée qui invoque simplement la procédure stockée de la base qui incrémente le générateur de 1.
    Je voudrais juste que vous nous donniez le source de cette procédure. Car votre problème n'a rien à voir avec le type de transaction que vous utilisez (sauf si effectivement votre procédure n'utilise pas ce qu'il faut pour générer des identifiants....)

  10. #10
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    procedure stockée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SET TERM ^ ;
    CREATE PROCEDURE INCVERSION
    RETURNS (
        NUMVERSION Integer )
    AS
    begin
      NumVersion = Gen_Id (IncNumVersion,1);
      suspend;
      exit;
    end^
    SET TERM ; ^
    code Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Version_Id: integer;
     
     
    function TDtmPrincipal.Version_Id: Integer;
    begin
    	FDSPVersionTablette.Prepare;
    	FDSPVersionTablette.ExecProc;
     
    	Result := FDSPVersionTablette.ParamByName('numversion').AsInteger;
    end;

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 245
    Points : 534
    Points
    534
    Par défaut
    Bonjour,
    Citation Envoyé par mballasse Voir le message
    code Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Version_Id: integer;
     
     
    function TDtmPrincipal.Version_Id: Integer;
    begin
    	FDSPVersionTablette.Prepare;
    	FDSPVersionTablette.ExecProc;
     
    	Result := FDSPVersionTablette.ParamByName('numversion').AsInteger;
    end;
    Je n'utilise pas Firedac mais les IBX plus basiques (un IBSQL est suffisant, même en appelant directement gen_id, et ne nécessite pas de Prepare, mais un Close après lecture), pour la lecture du résultat on utilise FieldByName ou en plus rapide Fields[0].asInteger au lieu de ParamByName(..).asInteger.

    André

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 033
    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 033
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par alanglet Voir le message
    Je n'utilise pas Firedac mais les IBX plus basiques (un IBSQL est suffisant, même en appelant directement gen_id, et ne nécessite pas de Prepare, mais un Close après lecture), pour la lecture du résultat on utilise FieldByName ou en plus rapide Fields[0].asInteger au lieu de ParamByName(..).asInteger.
    Je suis d'accord, obtenir la valeur de l'incrément ne nécessite pas l'utilisation d'une procédure alors qu'un SQL SELECT Gen_Id (IncNumVersion,1) FROM RDB$DATABASEMais il est aussi possible après un SQL INSERT d'obtenir la valeur générée par le trigger en utilisant RETURNING, le seul truc avec Firedac/FDQuery est d'utiliser un Open ou un OpenOrExecute au lieu de ExecSQL
    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

  13. #13
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Ca ne change pas son problème, toutes ces méthodes fonctionnent.

    Dans la PS, le "exit;" ne sert à rien, je l'enlèverais.


    Conclusion, vous utilisez bien un générateur firebird, la question reste donc : "Pourquoi il y a des doublons ?"

    Etant donnée que les générateurs fonctionnent très bien dans firebird, qu'il n'y a pas de bug connue et qu'ils sont utilisés par énormément de programmes, la piste la plus logique c'est malheureusement pour vous un bug dans vos programmes.


    Je commencerais par modifier la fonction d'appel de la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function Version_Id: integer;
     
     
    function TDtmPrincipal.Version_Id: Integer;
    begin
            FDSPVersionTablette.Close;      // pour m assurer que le composant est bien fermé je ne suis pas certain que si le composant est ouvert( suite à une première utilisation) que le "ExecProc" relance la demande au serveur... Donc par prudence je fermerais
    	                                             // j enlèverai le "prepare" qui est surtout utile si FDSPVersionTablette était définie en runtime (ici le nom de la procédure est défini en designtime donc la liste des parametres est connue) le prepare va demander au serveur la liste des parametres de la procedure
    	FDSPVersionTablette.ExecProc; // dans la doc firedac il est ecrit qu "ExecProc" est à utiliser si la procedure ne renvoie pas de données Essayez "ExecFunc" à la place...
     
    	Result := FDSPVersionTablette.ParamByName('numversion').AsInteger;
    end;
    Enfin une seconde piste possible :

    Dans votre programme sous certaines conditions, vous devez insérer ou mettre à jour vos identifiants de table sans avoir appelé votre fonction "Version_Id" et du coup utiliserait la dernière valeur mémorisée.

    Bonne recherche

  14. #14
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    Merci pour ces éléments de réponse, je vais les mettre en place

    Après avoir recherché les éléments invoqués par Barbibulle, pas de souci dans l'appel de Version_Id, l'appel à la procédre est bien invoqué chaque fois que j'en ai besoin

    Une autre piste que j'ai en tête est l'environnement Citrix : les programmes sont montés sur des machines virtuelles en mémoire et je me demande s'il n'y a a pas à un moment ou à un autre un partage de mémoire ou un cache excessif qui pourrait produire ce phénomène

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par mballasse Voir le message

    Depuis quelque temps, je me rends compte que je peux me retrouver avec des doublons de clé, ce qui commence a mettre en péril l'intégrité de la base de données

    En mode deboggage, aucun souci et aucune reproductivité possible, le générateur renvoyé est toujours unique….
    Ceci est parfaitement normal. En effet, aucun mécanisme SQL autre qu'une contrainte d'unicité ou de clef primaire ne peut garantir des valeurs unique dans une série du fait de la concurrence d'accès.

    En gros, quand vous testez, vous êtes seul à tester donc il n'y a aucun accès concurrent et donc les valeurs sont bien uniques.

    Dès que vous êtres plusieurs utilisateurs à exécuter SIMULTANÉMENT des requêtes, il y a parallélisation et vous vous retrouver avec des doublons.

    C'est une erreur gravissime que rencontrent tous les développeurs qui n'étudient pas comment fonctionne les bases de données et croient que les applicatifs qu'ils développent sont supérieurs en qualité et fonctionnalités, au fonctionnement d'un SGBDR, alors que c'est tout le contraire...

    Il n'y a donc aucun paramétrage à faire côté FireBird ni CITRIX, rien que votre cerveau à formatter pour repartir sur de bonnes bases !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Pour que tout ceci puisse avoir une chance de fonctionner sans générer de doublons, il faudrait…

    PREMIÈREMENT
    que la procédure stockée soit transactionnée au niveau d'isolation SERIALIZABLE.


    Citation Envoyé par mballasse Voir le message
    procedure stockée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SET TERM ^ ;
    CREATE PROCEDURE INCVERSION
    RETURNS (
        NUMVERSION Integer )
    AS
    begin
      NumVersion = Gen_Id (IncNumVersion,1);
      suspend;
      exit;
    end^
    SET TERM ; ^
    Si vous ne savez pas ce qu'est un niveau d'isolation transactionnel, ni comment piloter une transaction explicite, lisez l'article que j'ai écrit à ce sujet :
    https://sqlpro.developpez.com/isolation-transaction/


    DEUXIÈMEMENT

    Que votre code Delphi soit encapsulé dans un sémaphore système….


    code Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    function Version_Id: integer;
     
     
    function TDtmPrincipal.Version_Id: Integer;
    begin
    	FDSPVersionTablette.Prepare;
    	FDSPVersionTablette.ExecProc;
     
    	Result := FDSPVersionTablette.ParamByName('numversion').AsInteger;
    end;
    Et enfin que votre application ou votre service Delphi ne soit pas dédoublée au niveau de l'exécution.

    Ce qui bien évidemment est irréaliste car cela revient à dire, si c'est une application, qu'elle ne doit pas être lancée par plus d'un utilisateur simultanément….

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  17. #17
    Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Points : 56
    Points
    56
    Par défaut
    Je vais un peu compléter mes tests

    L'appel ExecFunc ne fonctionne pas : cela renvoie systématiquement une exception: Paramètre Result non trouvé
    Cela fonctionne par contre avec ExecProc

    Concernant les appels de Version_Id, ils se font hors transaction comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    NEWID := Version_ID
    FDConnection.StartTrasaction
    try
      FDQryInsertTOT.Close;
      if not (FDQryInsertTOT.Prepared) then 
      begin
        FDQryInsertTOT.Prepare;
      end;
      FDQryInsertTOT.ParamByname('VID').AsInteger :=   NEWID;
      ....
      FDQryInsertTOT.ExecSQL;
     
      FDConnection.Commit.
    except
      FDConnection.Rollback;
      raise;
    end;
    Lorsque l'utilisateurs et stout seul, il n'y a jamais aucun souci.
    Les dysfonctionnement apparaissent lorsque de la charge du serveur devient conséquente et que le nombre d'utilisateurs utilisant les mêmes écrans (donc même fonctionnalité d'insertion) augmentent.
    Pourtant lorsque le problème survenir, les utilisateurs sont bien sur le même écran , la même fonctionnalité d'insertion, mais sur des Serveurs Citrix différents (User1 sur CitriX1 , User2 sur Citrix9 par exemple).
    Autre élément, l'application utilise un seul utilisateur firebird pour se connecter à la base de données (utilisateur applicatif), configuré dnas la se de registre de l'utilisateur Windows.

Discussions similaires

  1. [Lazarus] Problème de générateur de mots de passe
    Par absolutej dans le forum Lazarus
    Réponses: 6
    Dernier message: 10/02/2016, 17h21
  2. Problème avec générateur requêtes
    Par NOLISPU dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 09/11/2013, 20h37
  3. Problème lié au générateur de Code VBA
    Par tarbala dans le forum IHM
    Réponses: 1
    Dernier message: 23/11/2008, 04h40
  4. problème générateur de lettre .
    Par kimlaw95 dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2007, 14h37
  5. probléme de générateur
    Par krole57 dans le forum SQL
    Réponses: 3
    Dernier message: 17/07/2006, 10h05

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