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

SQL Anywhere 12.0.0 (中文) » MobiLink - 服务器管理 » 使用 MobiLink 服务器技术 » 同步技术 » 冲突处理 » 检测冲突

 

通过 upload_fetch 或 upload_fetch_column_conflict 脚本检测冲突

如果为表定义了 upload_fetch 或 upload_fetch_column_conflict 脚本,MobiLink 服务器会将该脚本返回的行的已上载更新值的前映像与相同主键的值进行比较。如果前映像中的值与当前统一数据库中的值不匹配,则 MobiLink 服务器会检测到冲突。当检测到冲突时,服务器会调用 upload_old_row_insert 和 upload_new_row_insert 脚本,然后是 resolve_conflict 脚本。

注意

如果冲突过程中未定义 upload_old_row_insert 和 upload_new_row_insert 脚本,则会出现错误。如果同步表不需要这些脚本,请使用 --{ml_ignore} 语句将这些脚本定义为已忽略。

upload_fetch 和 upload_fetch_column_conflict 脚本间的区别是,MobiLink 服务器用来检测冲突的条件不同。使用 upload_fetch 脚本时,会把已读取行和前映像行之间的任何区别都当作冲突。使用 upload_fetch_column_conflict 脚本时,仅会在已读取行和前映像行之间比较由远程数据库更新的列。换言之,upload_fetch 提供基于行的冲突检测,upload_fetch_column_conflict 则提供基于列的冲突检测。

upload_fetch 脚本从统一数据库表中选择对应于正在更新的行的单行数据。使用该脚本的方法有两种。第一种方法是选择与上载的前映像相同的主键和列值。如果未返回行,MobiLink 服务器会检测到冲突。这种使用脚本的方法采用如下语法:

SELECT pk1, pk2, ...col1, col2, ...
FROM table-name
WHERE pk1 = {ml r.pk1} AND pk2 = {ml r.pk2} ...
   AND col1 = {ml o.col1} AND col2 = {ml o.col2} ...
注意

这种冲突检测方法不可用于那些拥有较大二进制列(比如 BLOB 和 CLOB)的同步表。

第二种方法是选择具有相同主键的行,由 MobiLink 服务器比较已读取行和上载的前映像。只要存在不同的列,MobiLink 服务器就会检测到冲突。该方法适用于所有可同步的列类型:

SELECT pk1, pk2, ...col1, col2, ...
FROM table-name
WHERE pk1 = {ml r.pk1} AND pk2 = {ml r.pk2} ...

请参见upload_fetch 表事件

upload_fetch_column_conflict 事件与 upload_fetch 相同,但在使用它时,MobiLink 服务器只会在上次同步后远程数据库和统一数据库上更新相同的列时,检测行的冲突。不同的用户可更新同一行,只要他们不更新同一列,就不会产生冲突。upload_fetch_column_conflict 事件只可应用到不含 BLOB 的同步表。

当使用 upload_fetch_column_conflict 脚本而未检测到冲突时,传递到 upload_update 脚本的行值来自于远程数据库的上载或 upload_fetch_column_conflict 脚本中的当前统一值。远程数据库的值用于在远程数据库上更新的列,其他情况中会使用当前统一值。换言之,只有在远程更新的列才会在统一中更新。

请参见upload_fetch_column_conflict 表事件

您只能为远程数据库中的每个表编写一个 upload_fetch 脚本或一个 upload_fetch_column_conflict 脚本。

 锁定统一数据库中的行
 示例