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

Bases de données Delphi Discussion :

Violation de clé primaire en multi-append


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Violation de clé primaire en multi-append
    Bonjour à tous,

    J'ai réalisé le petit test suivant :

    Je suis sous XP sp2, Firebird et j'utilise les composants IBO (TIBOQuery)
    J'ai une seule table TEST avec deux champs CODETEST(clé primaire)
    et MOT (char de 20) dans ma base placée sur un serveur.
    Un générateur et un trigger sont mises en place dans la base et
    le composant Query a été également paramétré (Relation,GeneratorLinks etc)

    J'ai crée une mini appli (en client serveur) avec deux boutons ajout et valider
    et le code est en mode transactionnel.
    un petit formulaire avec deux champs DB (un pour le CODETEST non accessible et un autre pour le champ MOT)

    On ne peut pas faire plus simple..

    L'isolation est : tiCommitted

    La connexion se fait bien et les validations aussi.

    Mais, j'ai voulu faire un test de simultanéité..(histoire de voir..)
    C'est-à-dire que seuls deux utilisateurs connectés ont fait dans la 1/2 seconde un clic sur le bouton valider.
    Et bing, un seul des deux a pu valider, l'autre (le plus en retard) ramasse une
    violation de clé primaire !
    J'ai donc refait un test afin de vérifier les chiffres du compteur et j'ai constaté qu'ils étaient bien différents avec un écart de 1 au moment des deux clics.

    Pourquoi donc cette violation ?

    Il y a quelque chose que j'ai vraisemblablement oublié et qui m'échappe..

    Merci de me donner un coup de main.

    cantador

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    as tu défini les propriétés GeneratorStep, GeneratorMode et KeyGenerator ?

  3. #3
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    J'utilise le TIBOQuery, le TDataSource,
    le TIB_Connection et le TIB_Transaction et deux TDBEdit.

    Les propriétés citées n'existent pas dans ces composants.

    Bien sûr, c'est un test théorique, car statistiquement j'ai une chance sur je ne sais pas combien que les deux clics se produisent en même temps..

    Mais je me demande quand même si c'est normal.

    nb: j'ai cherché sur le forum et rien trouvé mais j'ai peut-être mal cherché..


    cantador

  4. #4
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par cantador Voir le message
    Les propriétés citées n'existent pas dans ces composants
    autant pour moi, j'ai confondu avec le composant TIBCQuery.
    comment as tu configuré la propriété GeneratorLinks?
    je n'utilise pas ces composants, mais s'ils agissent comme les IBX, cette propriété permet de générer la clé primaire par un appel au générateur de celle ci. cela se fait soit juste après l'insertion d'un nouvel enregistrement, soit juste avant le post.

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    GeneratorLinks :


    NomDeLaTable.CléPrimaire = NomDuGénérateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TEST.CodeTest = GEN_TEST

    cantador

  6. #6
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    n'y a t'il pas une autre propriété qui définisse l'incrément du générateur ?

  7. #7
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Non je ne vois pas il n'y a que 3 élèments :

    Generator
    Trigger
    GeneratorLinks
    le keyLinks n'est pas défini mais j'ai mis le KeyLinksAutoDefine à true, donc il est crée automatiquement.

    les numéros générés sont d'ailleurs corrects..

    C'est la violation de clé primaire que je ne m'explique pas car elle ne se produit
    que si deux numéros sont identiques.
    Or ils sont différents..

    ???

    cantador

  8. #8
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par cantador Voir le message
    C'est la violation de clé primaire que je ne m'explique pas car elle ne se produit
    que si deux numéros sont identiques.
    Or ils sont différents..

    ???
    ouh là là, j'avais complètement zappé ça
    en effet c'est assez etrange.

    [EDIT]: dommage que je n'aie pas ces compos pour tester. je le ferai avec les IBX pour voir.

  9. #9
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Ils sont payants mais tu peux télécharger une version d'essai sur le site de John Wharton.
    @+

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 68
    Points : 55
    Points
    55
    Par défaut
    J'ai eu un petit soucis qui ressemble à ça.

    Es-tu sur que les clé générées par chaque utilisateurs sont différentes ? Est-ce que tu n'as plutôt les utilisateurs qui génèrent chacun de leur côté un numéro unique sans s'occuper de l'autre, et donc obtiennent un numéro identique ?

    Au cas où, laisse la base de donnée générer les clé primaires via les fonctions qui s'occupent de te renvoyer un nombre qui est incrémenté à chaque fois.

    En espérant avoir été utile.

    Bonne journée.

  11. #11
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @Cthulhu_RLyeh:

    Intéressant, mais çà voudrait dire que le serveur ne fonctionne pas..
    puisque le trigger est dans la table qui elle est dans la base placée sur le serveur.

    Par ailleurs, j'ai constaté que dès le BeforeInsert les numéros sont créés.

    Ainsi,lors des clics sur les boutons Ajout, on peut déjà voir à l'écran sur les deux machines les numéros qui s'affichent et qui sont différents.(avec un écart de 1)

    donc,le trigger et le générateur font bien leur travail..

    cantador

  12. #12
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    j'ai relu la doc de firebird et je me suis aperçu que j'avais oublié

    Mais çà ne change rien..seul le message se modifie :

    ISC ERROR CODE:
    "ISC ERROR MESSAGE:335544345

    lock conflict on no wait transaction
    violation of PRIMARY or UNIQUE KEY constraint "INTEG_103" on table "TEST"

    STATEMENT:
    TIBOInternalDataSet: "<TApplication>.Form1.IBOQuery1.IBOqrIBOQuery1."

    ??

    cantador

  13. #13
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    autre information :

    Je viens de constater que:

    Quelque soit l'ordre des clics c'est toujours le plus grand des deux qui se stocke et pas l'autre..

    et même le message d'erreur est quelquefois sur un PC et l'enregistrement se stocke quand même et pas l'autre !!

    çà devient fort de chez fort.

    cantador

  14. #14
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Quelqu'un pourrait-il faire le même test avec d'autres composants
    tels que FIB+ ou UIB ou autre ?

    merci par avance de votre collaboration

    cantador

Discussions similaires

  1. Gérer violation de clé primaire
    Par sebfch dans le forum Développement de jobs
    Réponses: 8
    Dernier message: 04/06/2015, 17h28
  2. Gérer les violations de clé primaire
    Par bribou dans le forum Développement
    Réponses: 9
    Dernier message: 16/08/2012, 17h46
  3. Réplication de LOAD DATA INFILE et violation de clefs primaires
    Par cedricgirard dans le forum Administration
    Réponses: 2
    Dernier message: 07/08/2011, 00h39
  4. Réponses: 1
    Dernier message: 19/06/2007, 16h36
  5. [Oracle 9i] Violation clé primaire
    Par duboisfa dans le forum Oracle
    Réponses: 1
    Dernier message: 13/12/2006, 15h20

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