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 服务器技术 » 同步技术 » 冲突处理 » 检测冲突

 

使用 upload_update 脚本检测冲突

要使用 upload_update 脚本检测冲突,请在 WHERE 子句中包括所有列:

UPDATE table-name
SET col1 = {ml r.col1}, col2 = {ml r. col2 } ...
WHERE pk1 = {ml o.pk1} AND pk2 = {ml o.pk2} ...
   AND col1 = {ml o.col1} AND col2 = {ml o.col2} ...

在此语句中,col1、col2 等是非主键列,而 pk1、pk2 等是主键列。传递到第二组非主键列 (o.) 的值是更新行的前映像(或旧值)。WHERE 子句将比较从远程数据库上载的旧值与统一数据库中的当前值。如果两个值不匹配,将忽略更新,保留统一数据库中已有的值。

请参见upload_update 表事件

仅当使用 upload_fetch 或 upload_fetch_column_conflict 没有检测到冲突时才使用 upload_update 脚本检测冲突。

第 1 种情形

为以下事件定义脚本:upload_update、upload_old_row_insert、upload_new_row_insert 和 resolve_conflict。

定义以下 upload_update 脚本:

UPDATE product
SET name={ml r.name}, description={ml r.description}
WHERE id={ml r.id}
   AND name={ml o.name}
   AND description={ml o.description}

MobiLink 执行更新,然后查看修改了多少行。如果没有行被修改,则 MobiLink 检测到冲突:统一数据库中没有行与前映像行匹配。MobiLink 将调用 upload_old_row_insert 和 upload_new_row_insert 脚本,然后调用 resolve_conflict。

请参见使用 resolve_conflict 脚本解决冲突

第 2 种情形

不为 upload_old_row_insert、upload_new_row_insert 和 resolve_conflict 定义脚本。而是创建一个存储过程来处理冲突检测和冲突解决,并在 upload_update 脚本中调用它。

请参见使用 upload_update 脚本解决冲突