跳到主要内容

getOrCreateSyncRecord()

function getOrCreateSyncRecord(
repoSyncRepo,
params,
instantiate
): Promise<RxDBSync>;

Defined in: packages/rxdb/src/sync-contract/sync-record-utils.ts:121

取出(或首次创建)某个 repository/branch 的同步水位记录

Parameters​

ParameterType
repoSyncRepoIRepository<typeof RxDBSync>
paramsGetOrCreateSyncRecordParams
instantiate() => RxDBSync

Returns​

Promise<RxDBSync>

Remarks​

find 与 create 之间没有原子性:同一个 repository 上并发的首次同步(例如同时触发 push 和 pull —— HistoryManager.syncing() 只置了一个布尔标志,并不串行化)会让两个 任务都查不到记录、都去 create。

id 就是 ${namespace}:${entity}:${branchId},本身是主键,所以写不出重复行; 代价是后到的那次稳定撞主键冲突,整条同步随之失败。这里在 create 失败后按主键重读一次: 记录已经在了就复用(说明是竞态),否则原样抛出(说明是真的写失败)。