Wie erhalten Sie Mobi Tabellen zu synchronisieren, so dass die jüngste aktualisierte Tabelle nicht überschrieben wird?

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

Frage

Hier ist das Szenario. Ich habe eine konsolidierte Oracle-Datenbank. Ich bin mit Mobi synchronisieren Oracle mit einer SqlAnywere Datenbank, die auf einem Handheld verwendet wird. Wenn userA einen Datensatz in der Remote-DB auf dem Handheld-Gerät „aktualisiert zuerst“ ändert und dann 10 Minuten später userB aktualisiert denselben Datensatz auf dem Handheld-Gerät auf „aktualisierten zweiten“ Ich mag die konsolidierte Datenbank immer zeigen „aktualisierte zweite“ nach die beiden Geräte synchronisiert sind. Derzeit wenn userB vor userA synchronisiert der konsolidierten Datenbank lesen „aktualisiert zuerst“ wird.

War es hilfreich?

Lösung

Im Moment Sie verwenden Standardkonfliktlösung im Mobilink-Server, so dass standardmäßig die letzte Synch in Siegen. Sie müssen Ihre eigene Konfliktlösung Schema implementieren, dies zu umgehen.

Das wird zwei Dinge benötigt in der entfernten Datenbank geschehen:

1) Es muss eine Spalte in der Tabelle in der entfernten Datenbank sein, die in der konsolidierten Datenbank synchronisiert, die die Zeit verfolgt, dass die Datensätze am entfernten Standort aktualisiert wurden.

2) Sie wird die Systemuhr an den entfernten Standorten vertrauen. Sollten die Menschen herauszufinden, wie Konflikte gelöst werden, und sie wollen, dass ihre Daten, um sicherzustellen, den Konflikt gewinnen, gibt es nichts einen Benutzer der Änderung die Systemzeit auf ihrem Remote-Gerät zur nächsten Woche zu stoppen, ihre Daten zu aktualisieren, die Änderung der Systemzeit zurück und dann synchronisiert wird.

In der konsolidierten, müssen Sie Konfliktlösung implementieren, die nicht so schwer ist. Solange Ihre Tabelle keine Kleckse nicht enthalten, können Sie Ihre Konfliktlösung im upload_update-Ereignis für die Tabelle schreiben. Lassen Sie uns einen Tisch in der entfernten Datenbank übernehmen, die wie folgt aussieht:

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
);

Lassen Sie uns auch eine Tabelle in der konsolidierten übernehmen, die sehr ähnlich sieht, hat aber auch eine andere letzte Änderung Spalte zu verfolgen, wenn Zeilen in der konsolidierten geändert haben.

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
);

Normalerweise Ihre upload_update Veranstaltung in etwa so aussehen:

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}'
);

Stattdessen werden wir neu schreiben Ihre upload_update Ereignis eine gespeicherte Prozedur aufzurufen, und auch in den alten Zeilenwerte aus der entfernten Datenbank übergeben.

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}’
);

Der Schlüssel zu Ihrer gespeicherten Prozedur ist, dass wir ein Update tun werden, aber die where-Klausel des Updates wird sowohl die Primärschlüsselwerte und die alten Zeilenwerte aus der entfernten Datenbank enthalten. Wenn jemand die Reihe am consoliated geändert hat, wird dieses Update aktualisieren null Zeilen, und wir wissen, dass ein Konflikt auftritt. Wenn es eine Zeile aktualisiert, dann gab es keinen Konflikt. Ihre gespeicherte Prozedur etwas aussehen wie dieser (pseudo-SQL unten):

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;

Weitere Informationen zur Konfliktlösung finden Sie im folgenden Abschnitt der v10 docs:

Mobilink - Serveradministration

Synchronisationsmethoden

Handhabung Konflikte

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

Andere Tipps

Angenommen, Sie zeitstempelbasierte Downloads oder Snapshot-Downloads umgesetzt haben, dann wird die Remote aktualisiert werden, um die konsolidierten anzupassen, wenn die Konsolidierung von einem anderen Fern seit der letzten Synchronisation aktualisiert wurde.

BTW, Sie die Art der Konfliktlösung wollen, ist verfügbar, wenn Sie ein Synchronisationsmodell (einrichten http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase. com% 2Fhtml% 2Fdbmgen10% 2Fmg-mg-about-s-5060632a.html ), 10 und oben in Version verfügbar. Entweder im Synchronisationsmodell Assistenten zum Erstellen oder auf der Seite Mappings, nachdem das Modell erstellt ist, können Sie wählen, ob Sie zeilenbasierte oder spaltenbasierte Konflikterkennung und verschiedene Arten von Konfliktlösung. Was Sie wollen, entspricht die „Zeitstempel“ Konfliktlösung Option, in dem Sie eine bestehende Timestamp-Spalte auswählen.

FYI, erklärt der Assistent die Optionen mehr als die Seite Mappings, so empfehle ich diese Optionen im Assistenten zuerst zu erkunden. Beachten Sie, dass, wenn die „Neuere Siege, einen Zeitstempel Spalte, die Sie pflegen“ Option abgeblendet ist, bedeutet dies, dass es keine Timestamp-Spalte in der synchronisierten Tabelle (n).

Wenn Sie ein Modell erstellt haben, können Sie die generierten Skripte in der Seite Ereignisse Vorschau. Wenn Sie das Modell der Einrichtung abgeschlossen haben, implementieren Sie es SQL und Batch-Dateien und / oder anwenden SQL direkt auf die Datenbanken zu erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top