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

InterBase Discussion :

Probléme accés conccurentiel au serveur InterBase


Sujet :

InterBase

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut Probléme accés conccurentiel au serveur InterBase
    Bonjour

    J'ai ma base FACT_BASE.GDB sur le Serveur INTERBASE.
    Sur deux poste clients j'ai l'exécutable et le client INTERBASE.

    Mon problème est le suivant : Quand le poste1 saisit des enegistrements , poste2 ne les voit pas et quand
    il veut saisir il y'a probléme de PRIMARY KEY parce que il y'a dejà des enegistrements saisis dans poste1 et qui
    ne sont pas visible entre les deux poste. Comment résoudre ce problème de visibilté instantanée ?
    J'ai fait IBTABLEX.REFRESH ,mais il n'y a rien. Ce probléme arrive seulement quand les deux postes accédent
    à la meme table. Dans le cas contraire où chaque poste travaille sur une table distincte tout marche et tant mieux.

    Pour la mise à jour de mes tables , j'utilise directement le IBTABLE.POST et non des IBQUERY qui sont pourtant c
    onseillés mais plus compliqués que les ibtables.

    Avant d'écrire l'enregistrement voici un bout du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     //
     Try
       if not DM1.IBTransaction1.InTransaction then
          DM1.IBTransaction1.StartTransaction;
          Dm1.IBTABLE8.post;
          DM1.IBTransaction1.CommitRetaining
        except
          DM1.IBTransaction1.Rollback
         end;
         //
    Y'a t il un moyen simple pour rafraichir la base de donnée aprés chaque modification pour que les autres
    postes voient ces changement et éviter d'avoir des pbms de clé double invisibles ?

  2. #2
    Rédacteur/Modérateur

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

    Voilà un des problèmes a utiliser des tables (et donc un ensemble d'enregistrements) plutôt que des Querys . En particulier par exemple dans des DBGrids .
    Ensuite cela dépend aussi beaucoup de la structure des tables (si par exemple en clé primaire vous utilisiez un Générateur le problème se poserait pas , en tout cas pas celui de PRIMARY KEY)

    Cependant, malgré cela
    des enregistrements saisis dans poste1 et qui ne sont pas visible entre les deux postes.
    c'est tout à fait normal , puisqu'il faudrait "rafraichir" la table du poste 2 lorsque le poste 1 fait des modifications et vice-versa
    pour cela , il existe des EVENTS et le composant TIBEvent .
    Pour simplifier le processus , disons que lorsque poste1 envoi une modification sur la table un trigger doit 'lever' un évènement
    à ce moment là le poste2 reçoit (par l'intermédiaire du TIBEvent) l'information comme quoi la table a reçu un changement et vous pouvez ainsi le traiter
    (rafraichissement de l'ensemble des données) mais attention , poste 2 peut aussi être en cours de modification !
    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
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    j'ai trouvé le composant IBEventx , à quoi il sert et comment l'utiliser pour rafraichir
    la base de donnée INTERBASE sur le serveur afin qu'elle soit visible dans l'autre poste ?
    Donnez moi du code à inserer dans mon programme pour que je puisse avancer ... et merci d'avance.

    La théorie est finalement juste une philosophie pour comprendre les choses , mais la pratique
    est essentielle.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    J'ai déjà répondu a cette question dans un autre Forum (Delphi ou Firebird) malheureusement la recherche ne semble plus fonctionner depuis la mise à jour du site

    j'ai trouvé le composant IBEventx , à quoi il sert et comment l'utiliser pour rafraichir
    TIBEvent permet de récupérer les EVENTs qui se passe sur la Base de Données (bien sur il faut lui indiquer ceux que l'on veut suivre dans la propriété Events)
    Comment ça marche ? considérez que c'est un événement (evenement onEventAlert) qui va s'exécuter sur tous les postes qui n'ont pas envoyer cette fameuse alerte , l'événement OnError s'exécutant lui s'il y a par exemple un arrêt du serveur Interbase

    Donnez moi du code à insérer dans mon programme pour que je puisse avancer
    rapidement , et sans gérer tous les cas par exemple :

    table1 est une table affichée dans un DBGrid ,
    chaque fois qu'il y a un UPDATE sur cette table un trigger lève l'event MISE_A_JOUR
    chaque fois qu'il y a un DELETE sur cette table un trigger lève l'event DELETE_REC
    Code SQL : 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
     
    SET TERM ^ ;
    CREATE TRIGGER TABLE_UPDATE FOR LATABLE ACTIVE
    AFTER INSERT OR UPDATE POSITION 0
    AS 
    BEGIN 
    	POST_EVENT 'MISE_A_JOUR';
    END^
     
    CREATE TRIGGER TABLE_DELETE FOR LATABLE ACTIVE
    AFTER DELETE POSITION 0
    AS 
    BEGIN 
    	POST_EVENT 'DELETE_REC';
    END^
     
    SET TERM ; ^
    Propriété IBEvents1.Events 'MISE_A_JOUR','DELETE_REC'

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure TForm1.IBEvents1EventAlert(Sender: TObject; EventName: String;
      EventCount: Integer; var CancelAlerts: Boolean);
    var Bookmark : TBookmark;
    begin
    if (EventName='MISE_A_JOUR') OR (EventName='DELETE') then
      begin
        Bookmark:=Table1.GetBookmark; // mémorise la position
        Table1.DisableControls;  // désactive l'affichage
        Table1.Active:=False;   // rafraichir 
        Table1.Active:=True;    
        try Table1.GotoBookmark(BookMark); except end;  // retour a la position
        Table1.EnableControls; // réactive affichage
      end;
    end;

    la touche sur le contrôle vous explique cela
    Citation Envoyé par Borland
    Description

    Utilisez un composant TIBEvents pour permettre à votre application de demander des notifications et de gérer de manière asynchrone des événements publiés par un serveur InterBase. L'événement InterBase permet aux applications de répondre à des actions et des modifications de base de données effectuées par d'autres applications s'exécutant simultanément, sans avoir à recourir à une interrogation régulière de la base de données ou à une communication directe avec les autres applications.

    En essence, le composant TIBEvents permet à une application de déclarer qu'elle souhaite être informée lorsque les événements X, Y et Z se produisent. Quand l'un des événements demandés se produit, le serveur InterBase avertit l'application et OnEventAlert est appelé.

    Pour utiliser TIBEvents, attribuez à la propriété Database le composant qui se connecte au serveur InterBase. Utilisez ensuite la propriété Events pour indiquer les événements auxquels vous voulez répondre. Vous pouvez attribuer la valeur true à la propriété AutoRegister si vous voulez que TIBEvents recense automatiquement la notification de ses événements quand le composant base de données ouvre une connexion, ou attribuez la valeur true à la propriété Registered après l'ouverture de la connexion afin de recenser explicitement votre notification. Enfin, écrivez un gestionnaire d'événements OnEventAlert pour répondre quand le gestionnaire d'événements InterBase informe TIBEvents qu'un événement s'est produit.
    si comme moi l'aide se bloque ensuite (impossible de trouver ibx.hlp) , lisez ibctrls.hlp
    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

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Je ne sais pas comment créer un trigger ?

    Où doit je inserer le code SQL du trigger que vous m'avez donné ? Dans IBCONSOLE ou sur la table

    TABLE1FACT du module de données qui contient toutes les tables de ma de données ? Et comment ?.

    Je tient beaucoup à votre réponse .......... et tous mes remerciements pour vous et tous ceux qui nous aide.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par HASSIOMAR Voir le message
    Je ne sais pas comment créer un trigger ?
    Où doit je inserer le code SQL du trigger que vous m'avez donné ? Dans IBCONSOLE
    Donc vous ne savez pas ce que c'est qu'un trigger ! je vous suggère de faire des recherches à ce sujet, profitez en pour savoir ce qu'est un GENERATEUR ( chapitre 6 et 7 )
    Vous auriez compris que les triggers font partie de la structure de la base de données comme les tables , vues et procédures !
    si vous aviez fait attention également vous auriez vu le Code SQL , au dessus du code que je vous ai posté
    (j'en profite pour modifier légèrement ce dernier TABLE étant un mot réservé)
    à la question : dans IBConsole , je répondrai par par tout GUI permettant de faire des modifications dans la structure de la base de données ou par programme

    pour le reste du post, je ne vois pas ce que vient faire le module de données dans cette discussion
    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

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Franchement vous m'avez encore dérouté , je vous ai juste demandé comment créer le trigger et vous m'envoyer au générateur ? Mais malgré tout je ferai encore des efforts en faisant des recherches sur FAQ comme vous me l'avez suggéré,je dois résoudre mon probléme.

    A bientôt

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 958
    Points
    40 958
    Billets dans le blog
    62
    Par défaut
    si je vous ai suggéré de regarder aussi les générateurs c'est par ce que dans mon premier post , je vous ai dit
    (si par exemple en clé primaire vous utilisiez un Générateur le problème se poserait pas , en tout cas pas celui de PRIMARY KEY)
    et que ce dernier se gére généralement via un Trigger

    par exemple
    j'ai une table GUESTS
    Code SQL : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    CREATE TABLE GUESTS
    (
      LASTNAME Varchar(30),
      SOUNDEX Varchar(8),
      FIRSTNAME Varchar(30),
      MIDDLENAME Varchar(30),
      PASSPORT_NUMBER Varchar(30),
      GUESTLOG Blob sub_type 1,
      REMARKS Blob sub_type 1,
      LAST_GROUP Bigint,
      LAST_UPDATE Timestamp,
      EMAIL Varchar(80),
      RECORD_NUMBER Bigint NOT NULL,
      COUNTRY_CODE Char(2),
      CITY Varchar(45),
      ZIP_CODE Varchar(15),
      COMPANY Varchar(45),
      ADRESS Blob sub_type 0,
      PHONE Varchar(20),
      VISA Varchar(30),
      VISA_ENDDATE Date,
      BIRTH_DATE Date,
      NATIONALITY Varchar(50),
      TITLE Varchar(8),
      CURRENT_ROOM Varchar(20),
      CONSTRAINT PK_GUESTS PRIMARY KEY (RECORD_NUMBER)
    );
    notez que la clé primaire est RECORD_NUMBER
    j'ai créé un générateur
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE GENERATOR GEN_GUESTS_ID;
    et un trigger qui va gérer l'insertion de nouveau guests (invités)
    Code SQL : 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
     
    SET TERM ^ ;
    CREATE TRIGGER GUESTS_BI FOR GUESTS ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.RECORD_NUMBER IS NULL) THEN
        NEW.RECORD_NUMBER = GEN_ID(GEN_GUESTS_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_GUESTS_ID, 0);
        if (tmp < new.RECORD_NUMBER) then
          tmp = GEN_ID(GEN_GUESTS_ID, new.RECORD_NUMBER-tmp);
      END
    END^
    SET TERM ; ^
    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

Discussions similaires

  1. [FTP] Problème accès serveur ftp
    Par ghost emperor dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 11/10/2007, 15h43
  2. même problème acces concurrent aux fichiers sur le serveur
    Par al3alwa dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 11/06/2007, 16h51
  3. Probléme de connexion avec le serveur Interbase
    Par mohamed2006 dans le forum InterBase
    Réponses: 1
    Dernier message: 01/07/2006, 16h38
  4. problème crash serveur Interbase
    Par lio33 dans le forum InterBase
    Réponses: 2
    Dernier message: 15/03/2006, 18h12
  5. Réponses: 11
    Dernier message: 13/10/2003, 14h48

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