Comment obtenez-vous Mobilink pour synchroniser les tables afin que la dernière mise à jour le tableau n'est pas écrasé?

StackOverflow https://stackoverflow.com/questions/941835

Question

Voici le scénario. J'ai une base de données consolidée Oracle. J'utilise Mobilink pour synchroniser Oracle avec une base de données SqlAnywere qui est utilisé sur un ordinateur de poche. Si userA change un enregistrement dans le dispositif DB sur leur ordinateur de poche à distance de « mise à jour d'abord », puis 10 minutes plus tard userB met à jour le même enregistrement sur leur appareil de poche pour « mise à jour seconde » Je veux la base de données consolidée pour toujours afficher « mis à jour seconde » après les deux appareils sont synchronisés. Actuellement, si userB synchronise avant userA la base de données consolidée lirons « mise à jour d'abord ».

Était-ce utile?

La solution

En ce moment, vous utilisez la résolution des conflits par défaut dans le serveur MobiLink, donc par défaut la dernière synchronisation dans les victoires. Vous aurez besoin de mettre en œuvre votre propre système de résolution des conflits pour gérer cela.

Il faudra deux choses pour arriver à la base de données distante:

1) Il y aura besoin d'être une colonne dans la table à la base de données distante qui synchronise la base de données consolidée qui suit le temps que les dossiers ont été mis à jour sur le site distant.

2) Vous devrez faire confiance à l'horloge du système sur les sites distants. Si les gens à comprendre comment les conflits sont résolus et ils veulent assurer que leurs données gagne le conflit, il n'y a rien qui empêche un utilisateur de modifier l'heure du système sur leur appareil à distance à la semaine prochaine, mettre à jour leurs données, en changeant le temps de système et les puis la synchronisation.

Au consolidée, vous aurez besoin de mettre en œuvre la résolution des conflits, ce qui est difficile. Tant que votre table ne comprend pas de blobs, vous pouvez écrire votre résolution des conflits en cas upload_update pour la table. Supposons une table à la base de données distante qui ressemble à:

create table Admin (
  admin_id           bigint default global autoincrement(1000000) primary key,
  data               varchar(64) not null,
  rem_last_modified  timestamp not null default timestamp
);

Supposons une table au consolidée qui semble très similaire, mais a aussi une autre colonne de dernière modification pour suivre lorsque les lignes ont changé au consolidé.

create table Admin (
  admin_id           bigint default global autoincrement(1000000) primary key,
  data               varchar(64) not null ,
  rem_last_modified  timestamp not null default ‘1900-01-01’,
  cons_last_modified timestamp default timestamp
);

En règle générale, votre événement upload_update ressemblerait à quelque chose comme ceci:

call ml_add_table_script( 'v1', 'Admin', 'upload_update',
'update Admin set data = {ml r.data}, 
              rem_last_modified = {ml r.rem_last_modified}  
 where admin_id = {ml r.admin_id}'
);

Au lieu de cela, nous allons ré-écrire votre événement upload_update pour appeler une procédure stockée et passer aussi dans les anciennes valeurs de ligne de la base de données distante.

call ml_add_table_script( 'v1', 'Admin', 'upload_update',
'call admin_upload_update( {ml r.admin_id}, 
    {ml r.data}, {ml r.rem_last_modified}, 
    {ml o.data}, {ml o.rem_last_modified}’
);

La clé de votre procédure stockée est que nous allons faire une mise à jour, mais la clause where de la mise à jour comprendra à la fois les valeurs clés primaires et les anciennes valeurs de ligne de la base de données distante. Si quelqu'un a changé la ligne au consoliated, cette mise à jour mettra à jour les lignes zéro, et nous savons d'un conflit. Si elle met à jour une ligne, alors il n'y avait pas de conflit. Votre procédure stockée ressemblera à quelque chose comme ceci (pseudo-SQL ci-dessous):

create procedure admin_upload_update ( 
    @admin_id bigint, 
    @new_data varchar(64), 
    @new_rem_lmod timestamp,
    @old_data varchar(64), 
    @old_rem_lmod timestamp 
)
begin
    declare @cur_rem_lmod timestamp;
    update admin set data = @new_data, rem_last_modified = @new_rem_lmod
     where admin_id = @admin_id 
       and data = @old_data 
       and rem_last_modified = @old_rem_lmod;
    if @@rowcount = 0 then
        // conflict !!
        select rem_last_modified into @cur_rem_lmod 
          from admin where admin_id = @admin_id;
        if @new_rem_lmod > @cur_rem_lmod then
            // update using new_data and new_rem_lmod
        else 
            // do nothing, current values in cons wins
        end if;
    end if;  
end;

Pour plus d'informations sur la résolution des conflits, voir la section suivante des v10 docs:

MobiLink - Administration du serveur

Techniques de synchronisation

conflits de manipulation

http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase.com%2Fhtml%2Fdbmlen10%2Fml-conflicts-synch.html

Autres conseils

En supposant que vous avez mis en œuvre téléchargements par estampille ou les téléchargements instantanés, puis la télécommande sera mis à jour pour correspondre à la synthèse, si la consolidation a été mis à jour par un autre à distance depuis la dernière synchronisation.

BTW, le type de résolution des conflits que vous voulez est disponible si vous configurez un modèle de synchronisation ( http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase. com% 2Fhtml% 2Fdbmgen10% 2Fmg-mg-environ-s-5060632a.html ), disponible dans la version 10 et au-dessus. Que ce soit dans l'assistant de création de modèle de synchronisation, ou dans la page Mappages le modèle est créé, vous pouvez choisir si vous voulez ramer ou à base de détection des conflits en colonnes, et les différents types de résolution des conflits. Ce que vous voulez correspond à l'option de résolution des conflits « d'horodatage », où vous choisissez une colonne d'horodatage existant.

Pour votre information, l'assistant explique les options plus que la page Mappages, donc je vous recommande d'explorer ces options dans l'assistant d'abord. Notez que si les « plus récents victoires, en utilisant une colonne d'horodatage que vous maintenez » option est grisée, cela signifie qu'il n'y a pas de colonne d'horodatage dans la table synchronisée (s).

Une fois que vous avez créé un modèle, vous pouvez afficher un aperçu des scripts générés dans la page des événements. Lorsque vous avez terminé la mise en place du modèle, vous déployez pour créer des fichiers SQL et par lots et / ou appliquer SQL directement aux bases de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top