getOrCreateSyncRecord()
function getOrCreateSyncRecord(
repoSyncRepo,
params,
instantiate
): Promise<RxDBSync>;
Defined in: packages/rxdb/src/sync-contract/sync-record-utils.ts:121
取出(或首次创建)某个 repository/branch 的同步水位记录
Parameters
| Parameter | Type |
|---|---|
repoSyncRepo | IRepository<typeof RxDBSync> |
params | GetOrCreateSyncRecordParams |
instantiate | () => RxDBSync |
Returns
Promise<RxDBSync>
Remarks
find 与 create 之间没有原子性:同一个 repository 上并发的首次同步(例如同时触发
push 和 pull —— HistoryManager.syncing() 只置了一个布尔标志,并不串行化)会让两个
任务都查不到记录、都去 create。
id 就是 ${namespace}:${entity}:${branchId},本身是主键,所以写不出重复行;
代价是后到的那次稳定撞主键冲突,整条同步随之失败。这里在 create 失败后按主键重读一次:
记录已经在了就复用(说明是竞态),否则原样抛出(说明是真的写失败)。