¿Cómo se consigue que Mobilink sincronice tablas para que no se sobrescriba la tabla actualizada más reciente?

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

Pregunta

Aquí está el escenario.Tengo una base de datos consolidada de Oracle.Estoy usando Mobilink para sincronizar Oracle con una base de datos SqlAnywere que se usa en una computadora de mano.Si el usuario A cambia un registro en la base de datos remota en su dispositivo portátil a "actualizado primero" y luego, 10 minutos después, el usuario B actualiza el mismo registro en su dispositivo portátil a "actualizado en segundo lugar", quiero que la base de datos consolidada siempre muestre "actualizado en segundo lugar" después Los dos dispositivos están sincronizados.Actualmente, si el usuario B se sincroniza antes que el usuario A, la base de datos consolidada leerá "actualizado primero".

¿Fue útil?

Solución

En este momento, se está utilizando la resolución de conflictos de forma predeterminada en el servidor MobiLink, lo que por defecto la última sincronización en victorias. Tendrá que poner en práctica su propio esquema de resolución de conflictos para manejar esto.

Esto requerirá dos cosas a suceder en la base de datos remota:

1) No tendrá que haber una columna en la tabla en la base de datos remota que se sincroniza con la base de datos consolidada que realiza un seguimiento del tiempo que los registros se actualizan en el sitio remoto.

2) Usted tendrá que confiar en el reloj del sistema en los sitios remotos. En caso de que las personas a averiguar cómo los conflictos se resuelven y quieren asegurarse de que sus datos gana el conflicto, no hay nada que impida que un usuario cambie la hora del sistema en su dispositivo remoto para la próxima semana, la actualización de sus datos, cambiar la hora del sistema de ida y entonces la sincronización.

En el consolidado, que necesita para poner en práctica la resolución de conflictos, que no es tan difícil. Mientras la tabla no incluye ninguna gotas, usted puede escribir su resolución de conflictos en caso upload_update para la tabla. Vamos a suponer una tabla en la base de datos remota que se parece a:

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

Supongamos también una mesa en el consolidado que es muy similar, pero también tiene otra última columna modificada para realizar un seguimiento cuando se han cambiado las filas en el consolidado.

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

Por lo general, su evento upload_update sería algo como esto:

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

En su lugar, vamos a volver a escribir su evento upload_update para llamar a un procedimiento almacenado y además debe pasar en los viejos valores de las filas de la base de datos remota.

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 clave de su procedimiento almacenado es que vamos a hacer una actualización, pero la cláusula where de la actualización incluirá tanto los principales valores de la clave y el viejo valores de las filas de la base de datos remota. Si alguien ha cambiado la fila en la consoliated, esta actualización se actualizará cero filas, y sabemos que se produce un conflicto. Si se actualiza una fila, entonces no hay conflicto. Su procedimiento almacenado se verá algo como esto (pseudo-SQL a continuación):

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;

Para obtener más información sobre la resolución de conflictos, consulte la siguiente sección de la documentación v10:

MobiLink - Administración de servidores

técnicas de sincronización

Manejo de conflictos

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

Otros consejos

Suponiendo que haya implementado descargas basadas en marcas de tiempo o descargas de instantáneas, el control remoto se actualizará para que coincida con el consolidado, si el consolidado fue actualizado por otro control remoto desde la última sincronización.

Por cierto, el tipo de resolución de conflictos que desea está disponible si configura un modelo de sincronización (http://dcx.sybase.com/index.php#http%3A%2F%2Fdcx.sybase.com%2Fhtml%2Fdbmgen10%2Fmg-mg-about-s-5060632a.html), disponible en la versión 10 y superior.Ya sea en el asistente Crear modelo de sincronización o en la página Asignaciones después de crear el modelo, puede elegir si desea una detección de conflictos basada en filas o en columnas, y diferentes tipos de resolución de conflictos.Lo que desea corresponde a la opción de resolución de conflictos "marca de tiempo", donde selecciona una columna de marca de tiempo existente.

Para su información, el asistente explica las opciones más que la página Asignaciones, por lo que recomiendo explorar esas opciones en el asistente primero.Tenga en cuenta que si la opción "Lo más nuevo gana, usando una columna de marca de tiempo que usted mantiene" está atenuada, significa que no hay ninguna columna de marca de tiempo en las tablas sincronizadas.

Una vez que haya creado un modelo, puede obtener una vista previa de los scripts generados en la página Eventos.Cuando haya terminado de configurar el modelo, lo implementará para crear archivos SQL y por lotes y/o aplicar SQL directamente a las bases de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top