【发布时间】:2023-03-17 10:05:01
【问题描述】:
假设我有一个Cloud 环境和一个Client 环境,我想将大量数据从云同步到客户端。假设我在云中有一个名为Files 的数据库表,我希望客户端环境中存在完全相同的表。
现在让我们假设一些事情:
- 文件表很大。
- 文件中每一行的数据可以随时更新,并有一个
last-update列。 - 我想获取增量并确保我在两个环境中都是相同的。
我的解决方案:
- 我先进行完全同步,将所有条目返回给客户端。
- 我将
LastSync时间保留在客户端环境中,并从LastSync时间开始同步增量。 - 我使用分页进行完全同步和增量同步:客户端将触发第一个请求以获取增量结果的
Count以及每个请求的Page Size所需的许多其他请求。
例如计数:
SELECT COUNT(*) FROM files WHERE last_update > @LastSyncTime
页面抓取:
SELECT col1, col2..
FROM files
WHERE last_update > @LastSyncTime
ORDER BY files.id
LIMIT @LIMIT
OFFSET @OFFSET
我的问题:
如果例如第一次提取(Count 提取)需要一些时间(例如几分钟)并且在这段时间内更多条目已更新并添加到 last-update 提取中。
例如:
- Count fetch 为
last-update 1000 seconds提供了 100 个条目。 - 在获取
Count时更新了 1 个条目。 - 现在
last-update 1000 seconds将提供 101 个条目。 - 页面获取只会从 101 中获取 100 个条目,顺序为
id - 1 个条目丢失且未同步到客户端
我尝试了其他 2 个选项:
- 与
from-to日期限制同步last-update。 - 按
last-update而非id列排序。
我发现这两个选项都有问题。
【问题讨论】:
标签: c# mysql paging data-paging