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

PHP & Base de données Discussion :

Synchronisation de deux base de données [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut Synchronisation de deux base de données
    Bonjour,

    Je travaille actuellement sur deux plateforme PHP que j'ai besoin de synchroniser pour certaines données comme les clients par exemple.

    Comme je sais qu'il existe les commandes BEGIN/COMMIT/ROLLBACK je me demandais ce qu'il se passait si par exemple je faisait schématiquement:

    DB1(COMMIT)
    DB2(COMMIT)

    DB1(INSERT client)
    if(!DB2(INSERT client with ID= ..)) DB1(ROLLBACK)DB2(ROLLBACK)
    else DB1(COMMIT)DB2(COMMIT)

    Le probleme c'est que si la deuxieme insertion ne se fait pas c'est que l'id existe deja dans la table de DB2, et que donc si ca me renvoie une erreur sql elle s'affichera sur l'ecran du visiteur.

    En fait j'aimerais savoir si ce que je veux faire peut etre fais silencieusement sans que le visiteur ne soit insulté par MySQL
    Such is the situation in our Fallen Galaxy

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Essaye d'éviter de faire la synchronisation en manuel!
    Par exemple si un même client est insérer dans deux bases differentes avant synchronisation c'est pas grave! Insère les enregistrement et puis APRES traite avec une requête (en proc stock ou un trigger d'insertion) pour éliminer les doublons ou une méthode similaire, pour en faire une table "consolidée". Mais il faut laisser la base être garante de son intégrité. Sinon on s'expose à une gestion à la main impossible. Les mécanismes que tu décris sont très complexes car concurentiels.
    Et comme ça personne ne se fait insulter

  3. #3
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    Disons que la seul chose qui m'intéresse c'est qu'un client A dans ma base 1 ait le même id que son occurence dans la base 2. Et si je m'arrange pour que la synchronisation se fasse dans les deux sens il est censé ne pas y avoir de conflit... sauf cas exceptionnelle ou des clients sont ajoutés simultannément sur les deux plateforme et que les insertions sont croisé sur les deux bases. Mais ca serait vraiement pas de bol. D'ou ma question sur les COMMIT et ROLLBACK.

    Sinon par curiosité tu as un site où je peux voir ce que tu veux dire par proc stock?
    Such is the situation in our Fallen Galaxy

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Désolé pour 'proc stock' je voulais parler de procédures stockées, c'est à dire des procédures qui s'exécutent au niveau de la base.
    Si tu penses qu'un même client ne peut pas être entré dans la base 1 et 2, donc pas de soucis.
    C'est de la requête SQL simple. C'est à dire à un instant T, tu lances la requête pour consolider les tables. Un coup sur la base 1 puis sur la base 2.
    Le plus fiable serait d'avoir une troisième base (base 3 consolidée) qui serait le reflet de la mise à jour des bases 1 et 2 à minuit par exemple pour telle date.
    En revanche si deux clients identiques peuvent être introduits sur la base 1 et 2, il te faut absolument gérer les doublons. Avec par exemple une table doublon qu'une application pourrait filtrer selon des critères à définir, pour réinjecter les clients dans les bases 1 ou 2, ou mieux dans une base 3, la base consolidée.
    Et surtout ne jamais penser ça ne serait pas de bol si...car ça arrive toujours (Loi de Murphy )

  5. #5
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Citation Envoyé par Asmodean
    Comme je sais qu'il existe les commandes BEGIN/COMMIT/ROLLBACK je me demandais ce qu'il se passait si par exemple je faisait schématiquement:

    DB1(COMMIT)
    DB2(COMMIT)

    DB1(INSERT client)
    if(!DB2(INSERT client with ID= ..)) DB1(ROLLBACK)DB2(ROLLBACK)
    else DB1(COMMIT)DB2(COMMIT)
    Normalement, ça devrait être bon, c'est la bonne logique.
    Par contre, au début, ça ressemblerait plutôt à quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DB1(BEGIN)
    DB2(BEGIN)
     
    DB1(INSERT client)
    if(!DB2(INSERT client with ID= ..)) DB1(ROLLBACK)DB2(ROLLBACK)
    else DB1(COMMIT)DB2(COMMIT)
    Citation Envoyé par Asmodean
    Le probleme c'est que si la deuxieme insertion ne se fait pas c'est que l'id existe deja dans la table de DB2, et que donc si ca me renvoie une erreur sql elle s'affichera sur l'ecran du visiteur.

    En fait j'aimerais savoir si ce que je veux faire peut etre fais silencieusement sans que le visiteur ne soit insulté par MySQL
    Si ton problème est juste de "cacher" ponctuellement à l'utilisateur une erreur déterminée, le mieux est d'utiliser l'opérateur @
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @mysql_query("selecte * fraum * ouaire 1!= 2")
    ne fera pas apparaître de message d'erreur à l'écran.
    Si tu veux cacher tous les messages d'erreurs en général, va voir l'option error_reporting du php.ini

    Citation Envoyé par tatareau
    Insère les enregistrement et puis APRES traite avec une requête (en proc stock ou un trigger d'insertion) pour éliminer les doublons ou une méthode similaire
    +1 pour les triggers, mais du coup ça devient beaucoup plus lourd ... a toi de voir si ça en vaut la peine, Asmodean.

    Citation Envoyé par Asmodean
    Sinon par curiosité tu as un site où je peux voir ce que tu veux dire par proc stock?
    "procédure stockée", je suppose ...

  6. #6
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    D'accord merci pour ces réponses... Je ne suis qu'au début du projet donc ca reste assez hypothétique mais ca m'a aidé à y voir plus clair

    Bonne soirée
    Such is the situation in our Fallen Galaxy

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Synchronisation de deux bases de données( locale et distante)
    Par chadha dans le forum Administration
    Réponses: 48
    Dernier message: 11/06/2019, 09h30
  2. Réponses: 0
    Dernier message: 10/11/2011, 15h09
  3. Synchronisation entre deux bases de données
    Par kimTunisia dans le forum Administration
    Réponses: 0
    Dernier message: 30/07/2011, 11h05
  4. Synchronisation de deux base de données (dont un base SQL Server 2000)
    Par Messie dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 27/02/2009, 09h32
  5. synchronisation entre deux bases de données via un webService
    Par débutant_C# dans le forum Services Web
    Réponses: 3
    Dernier message: 09/05/2008, 23h19

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