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 :

Update de table sur du multiposte (delphi)


Sujet :

Firebird

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    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
    Membre expert

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    mauvaise idée, utilise les générateurs
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    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
    Membre expert

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    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
    Membre expert

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    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
    Membre expert

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre expert

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    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
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 51
    Points
    51
    Par défaut
    Merci grand maitre
    J'ai beaucoup appris grâce à vous ces derniers temps
    Merci encore
    :-)

Discussions similaires

  1. [XL-2003] Peut-on faire un update de table sur une connexion ODBC avec Excel ?
    Par tibofo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/11/2009, 19h12
  2. Update trés lent sur une grosse table
    Par neo.51 dans le forum Oracle
    Réponses: 21
    Dernier message: 14/12/2005, 12h06
  3. [Oracle 9i] Triggers sur les updates de tables
    Par zestrellita dans le forum Oracle
    Réponses: 12
    Dernier message: 07/12/2005, 12h32
  4. update avec condition sur autre table
    Par allowen dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/04/2005, 16h02
  5. UPDATE avec condition sur d'autres tables
    Par guda dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/03/2005, 12h20

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