+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut Update de table sur du multiposte (delphi)

    Bonjour,

    J'ai cru comprendre la notion de transaction mais je suis perdu dans un cas précis d'update.

    Explication :

    1 - Je débute une transaction
    2 - Je récupère un compteur de facture dans une table (requête select)
    3 - Je fais un Inc(nofacture)
    4 - je fais une maj de compteur de facture dans la table (requête update)
    5 - je fais la suite : insert table facture, insert table ligne de facture,...
    6 - fin de transaction (si tout est ok)

    Questions :
    - Comment empêcher d'avoir le même no de facture si 2 postes enregistrent des factures au même moment ?
    - Il me semblait que les transactions seules permettaient de gérer cela ?
    - Quelqu'un pourrait-il me montrer un exemple de code pour éviter ce genre de conflits ?
    - Qu'est ce qui serait préférable pour l'exécution du code : code client ou procédure stockée avec passage de paramètre ?

    Merci d'avance pour votre aide :-)

  2. #2
    Expert Confirmé

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    mai 2002
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 2 317
    Points : 3 566
    Points
    3 566

    Par défaut

    mauvaise idée, utilise les générateurs
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut

    Bonsoir et merci pour votre réponse..
    J'ai bien pensé aux générateurs mais :
    1- je ne vois pas comment les utiliser dans mon cas de no de facture car
    c'est un no spécial du genre A ou F + mois + incrément compteur
    2- cela ne me dit pas si via générateur le multiposte fonctionnera pas automatiquement
    3- je poserai le même problème pour une maj de qté stock dans une table ART

    Merci

  4. #4
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut

    Bonsoir

    Autrement dit, pour éviter que 2 postes n'entrent en conflit en enregistrant en même temps, j'utilise le code suivant :

    1. try
    2. ibtransaction1.starttransaction
    3. requête ibquery pour lire le compteur avec blocage de l'enrgt :
    select compteur_facture
    from table_compteur
    with lock
    where code_compt = 'NOF'
    4. je récupère le compteur dans une variable compt
    5. Inc(compt)
    6. Maj du nouveau compteur via ibquery
    Update table_compteur
    set compteur_facture = :compt
    where code_compt = 'NOF'
    7. ibtransaction.commit
    8. except
    9. ibtransaction.rollback
    10. end


    Si j'enlève le WITH LOCK dans le SELECT, j'obtiens des messages DEADLOCK.
    J'ai tjrs pensé que la simple utilisation des transactions pouvait remédier ce genre de problèmes.
    Est-ce bien de cette façon qu'il faut coder ?
    Y-a-t-il un autre moyen d'y remédier ?
    Serait-il préférable d'utiliser des procédures stockées ?
    Avant avec des tables paradox, un simple EDIT sur la table bloquait l'enregistrement.

    Merci d'avance pour votre aide :-)

  5. #5
    Expert Confirmé

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    mai 2002
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 2 317
    Points : 3 566
    Points
    3 566
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  6. #6
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut

    Bonjour et merci pour votre réponse

    Toujours en conflit avec une personne qui prétend le contraire :

    On prétend que la simple utilisation du composant tibtransaction (starttransaction) et commit suffit pour que le serveur de sgbd fiebird
    puisse gérer tout seul les blocages d'enrgt.
    Est-ce vrai ?
    Ou est-ce à nous de compléter la propriété params du composant tibtransaction selon qu'il faille ou non bloquer des enrgt. ?

    Merci d'avance pour une réponse très précise.
    Cela m'aiderait à mettre les points sur les i une bonne fois pour toute
    avec certaines personnes qui ne développent et prétendre le contraire.

    merci encore :-)

  7. #7
    Expert Confirmé

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    mai 2002
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 2 317
    Points : 3 566
    Points
    3 566

    Par défaut

    Un TIB... déjà c'est pour Interbase, pas pour Firebird
    ensuite je ne sais pas quel type de transaction les TIB utilise par défaut
    ceci dit, c'est au dev de dire quel type de transaction il veut utiliser, toujours.
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  8. #8
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut

    Ah bon !!! il y aurait donc d'autres composants pour firebird ? lesquels ?
    Si TOB c'est pour interbase, pour firebird c'est quoi ?

    Quel type de transaction je voudrais ?
    Cest simple, 2 personnes enregistrent des factures :
    1. quels options utiliser dans les parametres de la transaction pour éviter d'avoird des lock conflit, deadlock ?
    2. J'ai toujours cru que les TIB pouvaient être utilisés pour Firebird
    3. Je n'arrive toujours pas (sans utiliser WITH LOCK) à gérer le multiposte
    sur une base firebird

    Merci :-)

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2009
    Messages : 461
    Points : 765
    Points
    765

    Par défaut

    Bonjour,

    Effectivement, il existe d'autres composants pour travailler avec Firebird. Je dirai même qu'ils sont recommandés.

    Vas voir cette discussion, tu auras toutes les explications.

    http://www.developpez.net/forums/d11...cter-firebird/

    En gratuit, le meilleur est à mon avis UIB. Après, il faut un peu d'investissement en temps pour maîtriser tout cela.

    Personnellement, j'emploie ZeosDBO version 6.6.6, je suis avec Firebird 2.1.4. J'ai fait quelques adaptations pour répondre à mes besoins. Ces composants ne fonctionnent pas avec Firebird 2.5, il faudra attendre la version 7.0. Ces composants sont également gratuits.

    La prise en main de ZeosDBO est simple et rapide.

    Bon courage

  10. #10
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut

    Bonjour et merci pour votre réponse
    En effet, j'ai bien vu en particulier FIBPlus mais pas encore
    les composants ZeosDb

    Peut-être votre grande expérience pourra aide un pauvre
    débutant en dev. sql sous delphi

    Est-ce vrai que les transactions à elles seules permettent de gérer
    le blocage des enregistrements en automatique ?
    Ou faut-il bien paramétrer les transactions en fonction de ce que l'on veut faire ?
    Exemple :
    1. Je lis un compteur dans une table (requete select)
    2. J'incrémente le compteur
    3. Je met à jour le compteur dans la table (requete update)

    Comment éviter les messages deadlock et "lock conflit" si plusieurs personnes
    exécutent le code ?
    Est-ce au developpeur de bloquer l'enregistrement ou est-ce la transaction ?

    Ce serait pratique si j'avais un exemple de code source

    Merci d'avance pour votre aide :-)

  11. #11
    Expert Confirmé

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    mai 2002
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 2 317
    Points : 3 566
    Points
    3 566

    Par défaut

    Citation Envoyé par asenaici Voir le message
    Comment éviter les messages deadlock et "lock conflit" si plusieurs personnes
    exécutent le code ?
    ça ne s'"évite pas", cela ce gère, c'est tout
    ensuite en général en read committed record version, ce genre de conflit est plus rare
    mais pas grave
    encore une fois cela ce gère
    il y a un conflit ?
    et bien je retente ma chance ou bien j'informe l'utilisateur du conflit, du genre "cet enregistrement a été modifié par un autre utilisateur, voir la dernière version ?" etc etc
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  12. #12
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut

    Bonjour,
    Désolé de ma lenteur mais je commence à comprendre

    Donc c'est bien au développeur de gérer cette situation et non
    aux transactions de le faire de manière automatique.

    Merci à tous pour votre aide et désolé si je vous ai paru insistant.
    Une toute dernière chose et je pourrai développer en paix.

    Vous dites qu'il fat le gérer, d'accord mais alors avec des exceptions ?
    Si oui il faut capter un no d'erreur correspondant à un deadlock ou lock conflit ?
    Si oui quel no d'erreur ?
    Pouvez-vous compléter mon code svp ?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Try
       if UIBTransaction1.InTransaction then
          UIBTransaction1.Commit;
       UIBTransaction1.StartTransaction;
       UIBQuery1.ExecSql;
       UIBTransaction1.Commit;
       Except
         On e : exception do
         begin
           UIBTransaction1.RollBack;
           ShowMessage(e.Message);
         end;
    End;
    Merci infiniment pour votre aide :-)

  13. #13
    Expert Confirmé

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    mai 2002
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 2 317
    Points : 3 566
    Points
    3 566

    Par défaut

    les codes d'erreur sont là : http://www.firebirdsql.org/en/reference-manuals/

    quand au rollback dans l'exception, il n'est pas necessaire, un commit coute moins cher
    cf http://www.ibphoenix.fr/spip.php?article39 dans
    Et à la fin : COMMIT ou ROLLBACK ?
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  14. #14
    Invité régulier
    Inscrit en
    mai 2002
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 100
    Points : 8
    Points
    8

    Par défaut

    Merci grand maitre
    J'ai beaucoup appris grâce à vous ces derniers temps
    Merci encore
    :-)

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •