内容摘要:在 MobiLink 客户端向 MobiLink 同步服务器发送一个更新后的行时,发送的数据中不仅包含该行的新值(后映像),而且还将包含旧行值的副本(前映像)。如果前映像与统一数据库中的当前值不匹配,表示检测到了冲突。
检测冲突的方法有两种:
*定义一个 upload_fetch 脚本。
*定义一个 upload_update 脚本,该脚本在 WHERE 子句中包含所有非主键列。
如果为同一个表定义这两个脚本,则只使用 upload_fetch 脚本。
仅当使用 upload_fetch 脚本或适当的 upload_update 脚本时,MobiLink 同步服务器才检测冲突。如果提供了 upload_fetch 脚本,MobiLink 同步服务器会将上载的前映像与 upload_fetch 脚本返回的包含相同主键值的行值进行比较。如果存在前映像中的值与当前统一数据库中的值不匹配的情况,则表示 MobiLink 同步服务器检测到了冲突。
我们这里用upload_fetch:
CALL ml_add_table_script(
'remote1',
'upload_fetch',
'SELECT empno, empname, gender, deptno, last_modified FROM emp WHERE empno = ?'
)出现冲突时,可以使用临时表(或永久表)和 resolve_conflict 脚本加以解决。
例如,我们可以先建两个临时表,然后在upload_old_row_insert表事件中把统一数据库的旧值插入专门存放旧值的临时表,然后再 upload_new_row_insert表事件中把想要更新的值插入专门存放新值的临时表。接下来就可以在resolve_conflict表事件中解决冲突了。
当然,除了通过resolve_conflict事件解决冲突,我们也可利用upload_update、end_upload来解决冲突。在本部分的屏幕录像中,我们先展示了没有自定义冲突处理时候MobiLink对冲突的默认解决方案,即后者决定的策略。在此之后,我们又自定义了新的MobiLink冲突解决方案,让部门号较小的更新成为最终值。
本部分的脚本如下:
先建立两个目录:remote1 & remote2。
责编:豆豆技术应用