Product 表的脚本演示了冲突检测及其解决办法。
Product 表与其它表分别保存在不同的发布中,因此它可以单独下载。例如:如果价格发生变化而销售代表正在通过速度缓慢的链接进行同步,他们无需上载自己客户和联系人的更改即可下载相关产品的更改。
远程数据库中可以进行的唯一更改是在获取订单时更改数量列。
download_cursor 以下 download_cursor 脚本将下载自从上次远程数据库同步后发生更改的所有行:
SELECT id, name, size, quantity, unit_price FROM product WHERE last_modified >= ? AND active = 1 |
download_delete_cursor 以下 download_delete_cursor 脚本删除公司停止销售的所有产品。这些产品在统一数据库中被标记为非活动状态。
SELECT id, name, size, quantity, unit_price FROM product WHERE last_modified >= ? AND active = 0 |
从远程数据库只上载 UPDATE 操作。这些上载脚本的主要功能是冲突检测与解决过程。
如果两个销售代表获取订单并执行同步,则每个订单都将从 Product 表的数量列中减去。例如,如果 Samuel Singer 获得了一个 20 套棒球帽(产品 ID 400)的订单,他会将数量从 90 更改为 70;如果 Pamela Savarino 在接收到此更改之前获得了一个 10 套棒球帽的订单,她会将自己数据库中的数量列从 90 更改为 80。
因此在 Samuel Singer 同步他的更改时,统一数据库中的数量列由 90 变为 70,而当 Pamela Savarino 同步她的更改时,正确的操作应该是将值设置为 60。而这一设置就是由冲突检测完成的。
冲突检测模式中包含以下脚本:
upload_update 以下 upload_update 脚本是统一数据库中的一个简单的 UPDATE:
UPDATE product SET name = ?, size = ?, quantity = ?, unit_price = ? WHERE product.id = ? |
upload_fetch 以下 upload_fetch 脚本从 Product 表中读取一个单独的行,并与已上载行的旧值进行比较。如果这两行的值不同,则说明检测到冲突。
SELECT id, name, size, quantity, unit_price FROM Product WHERE id = ? |
upload_old_row_insert 如果检测到冲突,则将旧值放入 product_conflict 表中,以供 resolve_conflict 脚本使用。添加该行时将在 row_type 列写入 O(表示原值)。
INSERT INTO DBA.product_conflict( id, name, size, quantity, unit_price, row_type ) VALUES( ?, ?, ?, ?, ?, 'O' )' ) |
upload_new_row_insert 以下脚本将在 product_conflict 表中添加已上载的行的新值,以供 resolve_conflict 脚本使用:
INSERT INTO DBA.product_conflict( id, name, size, quantity, unit_price, row_type ) VALUES( ?, ?, ?, ?, ?, 'N' ) |
resolve_conflict 以下脚本通过将旧行和新行之间的差加到统一数据库的数量值中来解决冲突:
UPDATE Product SET p.quantity = p.quantity - old_row.quantity + new_row.quantity FROM Product p, DBA.product_conflict old_row, DBA.product_conflict new_row WHERE p.id = old_row.id AND p.id = new_row.id AND old_row.row_type = 'O' AND new_row.row_type = 'N' |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |