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 :

Erreur "Record changed by another user"


Sujet :

Firebird

  1. #1
    Membre régulier Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Points : 112
    Points
    112
    Par défaut Erreur "Record changed by another user"
    Bonjour

    J'ai un problème qui semble tout bête mais pour lequel je n'arrive pas à trouver de solution ni même déterminer les causes exactes.

    J'ai une base firebird 2.0 avec plusieurs tables que je manipule avec un programme écrit avec C++Builder et les composants SQLDirect. Pour une table, j'ai des erreurs "Record changed by another user" dès que j'essaie d'y écrire... Or, je travaille en local, et je suis bien certain qu'aucune autre application n'accède à cette table.

    gfix ne me trouve aucune "limbo transaction", je ne comprends pas la raison de cette erreur... Quelqu'un l'a déjà rencontrée ? Quelle solution ?

    J'ai tenté sans succès de passer l'update mode en upWhereKeyOnly...
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.

  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
    houlala ...
    il faut aprendre à gérer tes transactions et tu n'as pas de limbo (limbo c'est seulement pour les commit deux phases entre deux bases)

    SQLDirect n'est pas forcément le meilleur choix
    en tout cas manifestement tu le manies mal
    c'est plus une question SQLDIRECT qu'une question Firebird
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre régulier Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Points : 112
    Points
    112
    Par défaut
    Merci pour ta réponse.

    Un problème de transactions ? Je m'en doutais un peu. Mais j'ai du mal à comprendre ce qui ne va pas... Une transaction est bien en cours, aucune autre opération d'écriture n'a été effectuée avant ! Bon, je vais faire quelques essais simples pour tenter de comprendre ce qui pourrait ne pas aller...

    Citation Envoyé par makowski
    tu n'as pas de limbo (limbo c'est seulement pour les commit deux phases entre deux bases)
    Argh ! Là, effectivement, je dois avoir mal compris quelque chose... Je pensais qu'une limbo transaction était une transaction laissée en plan lors d'une interruption du programme (par exemple suite à erreur mal gérée... ou reboot sauvage) ou coupure de la liaison avec le serveur ?

    Citation Envoyé par makowski
    SQLDirect n'est pas forcément le meilleur choix
    Probablement. J'y ai découvert effectivement plusieurs bugs. Mais bon, Yuri Sheino est assez réactif et je crains que ce soit un boulot assez énorme de transformer cette appli pour utiliser autre chose... A moins qu'il y ait un jeu de composants ayant la même approche et facilement adaptables ?
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.

  4. #4
    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
    en l'espèce ce n'est pas un bug sqldirect
    sqldirect est très bien quand on doit travailler avec differents sgdb
    si tu ne dois travailler qu'avec Firebird, autant prendre des outils spécialisés Firebird
    pour C++, il y a IBPP, mais aussi UIB qui fonctionnent avec C++Builder
    mais c'est une autre logique

    il faut que tu isoles tes traitements ou que tu fonctionnes en read committed
    à la manière du BDE
    ou alors que tu isoles tes traitements, travailles avec des select qui rapatrient les choses dans un dataset en mémoire et qui ferment leur transaction et faire des update, insert, delete dans une autre transaction
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  5. #5
    Membre régulier Avatar de jibe74
    Inscrit en
    Avril 2004
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 172
    Points : 112
    Points
    112
    Par défaut
    Effectivement, ce ne doit pas être un bug SQLDirect, puisque tout fonctionne bien avec d'autres tables, et qu'un essai simple avec celle-ci fonctionne egalement. C'est bien un code assez m**dique qui doit être à l'origine du problème.

    Mais comme en fouillant un peu j'étais tombé sur ceci et que j'ai effectivement sur cette table plusieurs index numériques et composés, je me demandais un peu s'il y avait une astuce...

    En fait, c'est une appli que je reprends, qui avait été écrite il y a longtemps en utilisant BDE, puis est passée sous FlashFiler pour finir avec Firebird... Autant dire que le code n'est pas très génial ! Mais comme elle fonctionne à 80% dans l'état actuel, et que je ne suis chargé que de mettre au point les 20% qui ne l'ont pas été lors de la migration depuis FlashFiler, j'hésite un peu à tout reprendre...

    Je connais IBPP qui est bien, mais ce ne sont pas des composants => une philosophie assez différente et réécriture totale des parties concernées, et au final manque de cohérence avec le reste de l'appli... J'ai découvert UIB il y a quelque temps au hasard de mes interrogations de google, mais n'ai pas étudié de près. Serait-ce assez facile de (tout) repasser de SQLDirect à UIB sans trop modifier de code ? Serait-ce intéressant ?

    J'en doute un peu, si on garde une approche de type BDE... A moins que cela facilite nettement la mise au point de la partie que je dois faire fonctionner ? J'apprécierai tout conseil, mais j'ai bien peur d'être condamné à me débrouiller avec ce qui existe
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.

Discussions similaires

  1. Couldn't perform the edit because another user changed the record
    Par sondo dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/10/2008, 21h25
  2. Réponses: 1
    Dernier message: 05/12/2007, 16h57
  3. Réponses: 14
    Dernier message: 08/03/2007, 16h18
  4. Réponses: 2
    Dernier message: 21/02/2007, 09h00
  5. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31

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