Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » MobiLink - 服务器管理 » 使用 MobiLink 服务器技术 » 同步技术 » 冲突处理 » 解决冲突

 

使用 resolve_conflict 脚本解决冲突

当 MobiLink 服务器使用 upload_fetch 脚本检测到冲突后,将发生以下事件。

  • MobiLink 服务器按照 upload_old_row_insert 脚本的定义插入从远程数据库上载的旧行值。通常将旧值插入到临时表中。

    请参见upload_old_row_insert 表事件

  • MobiLink 服务器按照 upload_new_row_insert 脚本的定义插入从远程数据库上载的新行值。通常将新值插入到临时表中。

    请参见upload_new_row_insert 表事件

  • MobiLink 服务器执行 resolve_conflict 脚本。在此脚本中,您可以调用存储过程,或定义一系列步骤以便使用新行值和旧行值来解决冲突。

有关详细信息,请参见resolve_conflict 表事件

示例

在下面的示例中,您将为 6 个事件创建脚本,然后创建一个存储过程。

  • 在 begin_synchronization 脚本中,创建两个名为 contact_new 和 contact_old 的临时表。(也可在 begin_connection 脚本中执行此操作。)

  • upload_fetch 脚本检测到冲突。

  • 当存在冲突时,upload_old_row_insert 和 upload_new_row_insert 脚本将使用从远程数据库中上载的新旧数据来填充这两个临时表。

  • resolve_conflict 脚本调用存储过程 MLResolveContactConflict 来解决此冲突。

事件 脚本
begin_synchronization
CREATE TABLE #contact_new( 
   id  INTEGER,
   location CHAR(36),
   contact_date DATE);
CREATE TABLE #contact_old(
   id  INTEGER,
   location CHAR(36),
   contact_date DATE)
upload_fetch
SELECT id, location, contact_date
   FROM contact
   WHERE id = {ml r.id}
upload_old_row_insert
INSERT INTO #contact_new( id, location, contact_date ) 
  VALUES ( {ml r.id}, {ml r.location}, {ml r.contact_date} )
upload_new_row_insert
INSERT INTO #contact_old( id, location, contact_date )
  VALUES ( {ml r.id}, {ml r.location}, {ml r.contact_date} )
resolve_conflict
CALL MLResolveContactConflict( )
end_synchronization
DROP TABLE #contact_new;
DROP TABLE #contact_old

存储过程 MLResolveContactConflict 如下:

CREATE PROCEDURE MLResolveContactConflict( )
BEGIN
  --update the consolidated database only if the new contact date
  --is later than the existing contact date
  UPDATE contact c
    SET c.contact_date = cn.contact_date
      FROM #contact_new cn
      WHERE c.id = cn.id
        AND cn.contact_date > c.contact_date;
  --cleanup
  DELETE FROM #contact_new;
  DELETE FROM #contact_old;
END