我们正在使用 Salesforce Bulk API 2.0 查询作业来复制 SF 实例中的更改 (https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/query_create_job.htm)将记录上传到我们的仓库。 我们使用以下查询来提取数据:
SELECT id,... FROM Lead WHERE systemModStamp > <last_sync_date>
其中last_sync_date是我们仓库中存在的最大systemModStamp时间戳 - 基本上提取自上次同步以来已修改/更新的所有记录。
最近我们注意到 Lead 对象中的一些记录丢失了 - 我们可以使用 SF Web 应用程序查看它们,但在基于 systemModStamp 字段进行过滤时它们丢失了,即使我们过滤的时间戳是在创建记录之前也是如此。 使用查询显式过滤该记录时:
SELECT id,... FROM Lead WHERE id = <lead_id>
其中 Lead_id 是我们丢失的记录 ID,我们确实得到了结果中丢失的记录,这可能解决了我们的权限问题 - 这也可以使用
createddate
字段。
我们丢失的记录看起来与任何其他记录没有任何不同,也没有任何可能导致此行为的标志。
我们尝试更改 API 版本,但似乎没有任何影响。
我们此刻也看到了类似的情况。虽然我不知道根本问题,但我确实有一个理论。是否会出现以下情况:
所以我的理论是,DML 语句(设置 Id 和 systemModStamp )和实际提交(使记录可见)(可能与稍后开始并较早完成的其他事务结合使用)之间的短暂时间可能会导致此记录检索逻辑不滴水不漏。
我们将进一步研究这个理论。我们现在的解决方法是使用早于我们希望的值的 systemModStamp 值进行查询,检索潜在的重复项(我们之前处理过的记录),同时也获取我们现在错过的记录。我们需要照顾重复项。
如果您有任何更新,我会非常感兴趣。
亲切的问候, 卢卡斯