fix: 消除保存并发竞态——同步锁防重复保存,冲突判定先比对内容

This commit is contained in:
yu committed 2026-10-28 17:38:41 +08:00
1 parent 6cb10db375
commit a5d9f0bfee
2 files changed
+24 -10

No files matched your search

+16 -7
View File
@@ -129,14 +129,23 @@ function registerIpc(): void {
});
ipcMain.handle("flows:get", (_event, id: string) => getFlow(id));
ipcMain.handle("flows:save", (_event, flow: FlowDefinition, opts?: FlowSaveOptions): FlowSaveResult => {
if (!opts?.force && opts?.expectedUpdatedAt) {
const disk = getFlow(flow.id);
if (disk && disk.meta?.updatedAt && disk.meta.updatedAt !== opts.expectedUpdatedAt) {
return { conflict: true, diskFlow: disk };
if (!opts?.force && opts?.expectedUpdatedAt) {
let disk: FlowDefinition | null = null;
try {
disk = getFlow(flow.id);
} catch {
disk = null; // 磁盘文件不存在或损坏时视为全新保存
}
if (disk && disk.meta?.updatedAt && disk.meta.updatedAt !== opts.expectedUpdatedAt) {
// 内容一致(仅 updatedAt 差异,如并发/重复保存)不视为冲突
const normalize = (item: FlowDefinition) => JSON.stringify({ ...item, meta: undefined });
if (normalize(disk) !== normalize(flow)) {
return { conflict: true, diskFlow: disk };
}
}
}
}
return { conflict: false, flow: saveFlow(flow) };
});
return { conflict: false, flow: saveFlow(flow) };
});
ipcMain.handle("flows:delete", (_event, id: string) => {
deleteFlow(id);
return true;