4D v16

SYNCHRONIZE

Accueil

 
4D v16
SYNCHRONIZE

SYNCHRONIZE  


 

 

SYNCHRONIZE
[LOCAL] TABLE ref_table (ref_colonne_1,...,ref_colonne_N)
WITH
[REMOTE] TABLE ref_table (ref_colonne_1,...,ref_colonne_N)
FOR REMOTE [STAMP] {nombre_entier | ref_langage_4d},
LOCAL [STAMP] {nombre_entier | ref_langage_4d}
{REMOTE OVER LOCAL | LOCAL OVER REMOTE}
LATEST REMOTE [STAMP] ref_langage_4d,
LATEST LOCAL [STAMP] ref_langage_4d;

La commande SYNCHRONIZE permet de synchroniser deux tables situées sur deux serveurs 4D SQL différents. Toute modification effectuée sur une table est reportée dans l’autre. Le serveur 4D SQL qui exécute la commande est appelé serveur local (LOCAL), l’autre serveur est appelé serveur distant (REMOTE).

La commande SYNCHRONIZE équivaut à la combinaison de deux appels internes à la commande REPLICATE. Le premier appel réplique les données depuis le serveur distant vers le serveur local, le second effectue l’opération inverse : réplication des données du serveur local vers le serveur distant. Les tables à synchroniser doivent donc être configurées pour la réplication :

  • elles doivent comporter une clé primaire,
  • l’option "Activer réplication" doit être cochée dans l’Inspecteur de chaque table.

Pour plus d’informations, reportez-vous à la description de la commande REPLICATE

La commande SYNCHRONIZE accepte quatre marqueurs (stamps) en "paramètres" : deux marqueurs en entrée et deux marqueurs en sortie (dernière modification). Les marqueurs d’entrée sont utilisés pour indiquer le moment de la dernière synchronisation sur chaque serveur. Les marqueurs de sortie retournent la valeur des marqueurs de modification sur chaque serveur juste après la dernière modification. Grâce à ce principe, lorsque la commande SYNCHRONIZE est appelée régulièrement, il est possible d’utiliser les marqueurs de sortie de la dernière synchronisation en tant que marqueurs d’entrée pour la suivante. 

Note : Les marqueurs d’entrée et de sortie sont exprimés sous forme de valeurs numériques (stamps), et non de marqueurs de temps (timestamps). Pour plus d’informations sur ces marqueurs, reportez-vous à la description de la commande REPLICATE

En cas d’erreur, le marqueur de sortie du serveur concerné contient le marqueur de l’enregistrement à l’origine de l’erreur. Si l’erreur provient d’une cause externe à la synchronisation (problèmes réseau par exemple), le marqueur contient 0.
Il y a deux codes d’erreurs différents, l’un pour indiquer une erreur de synchronisation sur le site local et l’autre sur le site distant.
En cas d’erreur, l’état des données dépend de celui de la transaction sur le serveur local. Sur le serveur distant, la synchronisation est toujours effectuée dans le contexte d’une transaction, les données ne peuvent donc pas être altérées par l’opération. Sur le serveur local en revanche, le processus de synchronisation est placé sous le contrôle du développeur. Il est effectué en-dehors de toute transaction si la préférence Transactions Auto-commit est désélectionnée (dans le cas contraire, un contexte de transaction est automatiquement créé). Le développeur peut décider de démarrer une transaction, il lui revient de la valider ou de l’annuler après la synchronisation des données. 

Vous pouvez "forcer" le sens de la synchronisation à l'aide des clauses REMOTE OVER LOCAL et LOCAL OVER REMOTE en fonction des caractéristiques de votre application. Pour plus d’informations sur les mécanismes mis en oeuvre, reportez-vous à la description de la commande REPLICATE

Note : Les opérations effectuées par la commande SYNCHRONIZE ne tiennent pas compte des contraintes d’intégrité des données. Cela signifie par exemple que les règles de clés étrangères, d’unicité, etc. ne sont pas vérifiées. Si les données reçues peuvent remettre en cause l’intégrité des données, vous devez les vérifier à l’issue de l’opération de synchronisation. Le moyen le plus simple est de verrouiller via le langage 4D ou le langage SQL les enregistrements devant être modifiés.

4D retourne dans les variables ref_langage_4d des clauses LATEST REMOTE STAMP et LATEST LOCAL STAMP les valeurs des derniers marqueurs des tables distante et locale. Ces informations permettent d'automatiser la gestion de la procédure de synchronisation. Elles correspondent à la valeur des marqueurs juste après la fin de l’opération de réplication : si vous les utilisez dans une instruction REPLICATE ou SYNCHRONIZE ultérieure, vous n’avez pas besoin de les incrémenter, ils le sont automatiquement avant d’être retournés par la commande REPLICATE.

Exemple  

Pour bien comprendre les mécanismes mis en jeu lors d'une opération de synchronisation, nous allons examiner les différentes éventualités relatives à la mise à jour d'un enregistrement existant dans les deux bases synchronisées.

La méthode de synchronisation est de la forme suivante :

 C_LONGINT(vRemoteStamp)
 C_LONGINT(vLocalStamp)
 C_LONGINT(vLatestRemoteStamp)
 C_LONGINT(vLatestLocalStamp)
 
 vRemoteStamp:=X... // voir valeurs dans le tableau ci-dessous
 vLocalStamp:=X... // voir valeurs dans le tableau ci-dessous
 vLatestRemoteStamp:=X... // valeur retournée dans un précédent LATEST REMOTE STAMP
 vLatestLocalStamp:=X... // valeur retournée dans un précédent LATEST LOCAL STAMP
 
 Begin SQL
    SYNCHRONIZE
        LOCAL MYTABLE (MyField)
        WITH
        REMOTE MYTABLE (MyField)
        FOR REMOTE STAMP :vRemoteStamp,
        LOCAL STAMP :vLocalStamp
        LOCAL OVER REMOTE  // ou REMOTE OVER LOCAL, voir dans le tableau ci-dessous
        LATEST REMOTE STAMP :vLatestRemoteStamp,
        LATEST LOCAL STAMP :vLatestLocalStamp;
 End SQL

Les données de départ sont les suivantes :

  • Le marqueur de l’enregistrement dans la base LOCAL a pour valeur 30 et celui dans la base REMOTE a pour valeur 4000
  • Les valeurs du champ MyField sont les suivantes :
    LOCALREMOTE
    Ancienne valeurNouvelle valeurAncienne valeurNouvelle valeur
    AAABBBAAACCC
  • Nous utilisons les valeurs retournées par des précédents LATEST LOCAL STAMP et LATEST REMOTE STAMP de manière à synchroniser uniquement ce qui a été modifié depuis la dernière synchronisation.

Voici les synchronisations effectuées par la commande SYNCHRONIZE en fonction des valeurs passées dans les paramètres LOCAL STAMP et REMOTE STAMP ainsi que de l'option de priorité utilisée : ROL (pour REMOTE OVER LOCAL) ou LOR (pour LOCAL OVER REMOTE) :

LOCAL STAMPREMOTE STAMPPrioritéLOCAL après syncREMOTE Après syncSynchronisation LOCAL - REMOTE
203000ROLCCCCCC<---->
203000LORBBBBBB<---->
313000ROLCCCCCC<--
313000LORCCCCCC<--
204001ROLBBBBBB-->
204001LORBBBBBB-->
314001ROLBBBCCCPas de synchronisation
314001LORBBBCCCPas de synchronisation
403000ROLCCCCCC<--
403000LORCCCCCC<--
205000ROLBBBBBB-->
205000LORBBBBBB-->
405000ROLBBBCCCPas de synchronisation
405000LORBBBCCCPas de synchronisation



Voir aussi  

REPLICATE

 
PROPRIÉTÉS 

Produit : 4D
Thème : Commandes SQL

 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D - Référence SQL ( 4D v16)