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 技术简介 » 了解 MobiLink 同步 » 同步过程

 

参照完整性与同步

除 UltraLiteJ 以外,所有 MobiLink 客户端在将下载项并入远程数据库时都将实施参照完整性。

缺省情况下,MobiLink 客户端会自动删除所有违反参照完整性的行,而非放弃下载事务。

此功能包括以下优点:

  • 同步脚本中的防错保护。由于脚本的灵活性,有可能意外地将破坏远程数据库完整性的行下载下来。MobiLink 客户端可自动保持参照完整性,无需干预。

  • 可以使用该参照完整性机制有效地从远程数据库中删除信息。MobiLink 客户端只将删除发送给父记录,从而自动移除所有的子记录。这将大大降低 MobiLink 必须发送给远程数据库的通信量。

如果 MobiLink 客户端必须显式删除行以保持参照完整性,它会如下所述提供通知:

  • 对于 SQL Anywhere 客户端,dbmlsync 将在日志中写入一个条目。同时还有 dbmlsync 事件挂接供您使用。请参见:

  • 对于 UltraLite 客户端,将引发 SQLE_ROW_DELETED_TO_MAINTAIN_REFERENTIAL_INTEGRITY 警告。此警告以表名为参数。为了保持参照完整性,每删除一行都将引发此警告。如果您希望同步仍然继续,应用程序可以忽略警告。如果希望显式处理警告,可以使用错误回调函数来捕获它们,例如,计算将删除的行数。

    在引发警告时,如果要放弃同步,则必须执行同步观察器,然后从错误回调函数给观察器发信号(或者通过一个全局变量)。这种情况下,将会在下次调用观察器时放弃同步。

在事务结束时检查参照完整性

MobiLink 客户端在单个事务中并入来自下载的更改。为了提供更大的灵活性,参照完整性检查将在此事务结束处进行。由于检查被延迟,因此数据库可能会暂时出现违反参照完整性的状态。这是因为违反参照完整性的行在提交下载之前将被自动删除。

示例

假设 UltraLite 销售应用程序包含以下两个表。一个表包含销售订单。另一张表是各订单中销售的项目。它们具有以下关系:

实体图显示 sales_order 和 sales_order_items 的 UltraLite 表。

如果您使用 sales_order 表的 download_delete_cursor 删除一个订单,缺省参照完整性机制将自动地删除 sales_order_items 表中所有指向被删除销售订单的行。

这种机制有以下优点:

  • 您不需要 sales_order_items 表脚本,因为该表中的行将被自动删除。

  • 同步的效率得以提高。您不需要下载从 sales_order_items 表中删除的行。如果每个销售订单包含很多项目,由于现在减少了下载,所以性能得以提高。此技术在使用较慢的通信方法时尤其适用。

更改缺省行为

对于 SQL Anywhere 客户端,可以使用 sp_hook_dbmlsync_download_ri_violation 客户端事件挂接来处理参照完整性违规。Dbmlsync 还会在其日志中写入一个条目。

请参见: