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_fetch 脚本检测冲突

如果为表定义了 upload_fetch 或 upload_fetch_column_conflict 脚本,MobiLink 服务器会将 upload_fetch 脚本返回的行的更新值的前映像与相同主键的值进行比较。如果前映像中的值与当前统一数据库中的值不匹配,则 MobiLink 服务器会检测到冲突。

upload_fetch 脚本从统一数据库表中选择对应于正在更新的行的单行数据。典型的 upload_fetch 脚本的语法如下所示:

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

请参见upload_fetch 表事件

upload_fetch_column_conflict 事件与 upload_fetch 相似,但它只检测两个用户更新同一列时的冲突。不同的用户可更新同一行,只要他们不更新同一列,就不会产生冲突。

请参见upload_fetch_column_conflict 表事件

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

锁定统一数据库中的行

在 upload_fetch 脚本检测到冲突之后和冲突解决之前,统一数据库中的行可以发生更改。此问题会导致数据不正确,要避免此问题,可以实现带有行锁定的 upload_fetch 或 upload_fetch_column_conflict 脚本。

在 SQL Anywhere 统一数据库中,您可以使用 UPDLOCK 或 HOLDLOCK 关键字,但 UPDLOCK 更适合并发。例如:

SELECT column-names from table-name WITH (UPDLOCK) 
  WHERE where-clause

对于 Oracle、DB2 LUW 和 DB2 主机,请使用 FOR UPDATE。例如:

SELECT column-names FROM table-name
  WHERE where-clause
    FOR UPDATE OF column_name1, column_name3, column_name6
注意

如上例所示,指定要更新的列名称可节省计算机资源并提高性能。

对于 Microsoft SQL Server,请使用 HOLDLOCK。例如,

SELECT column-names FROM table-name WITH (HOLDLOCK)
  WHERE where-clause

对于 Adaptive Server Enterprise,请使用 HOLDLOCK。例如,

SELECT column-names FROM table-name
  HOLDLOCK 
  WHERE where-clause
示例

定义一个 upload_fetch 脚本。MobiLink 服务器使用此脚本在统一数据库中检索当前行并将该行与更新行的前映像进行比较。如果这两行包含相同的值,则没有冲突。如果两行的值不同,则检测到冲突,MobiLink 将调用 upload_old_row_insert 和 upload_new_row_insert 脚本,然后调用 resolve_conflict。

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