fix: 消除保存并发竞态——同步锁防重复保存,冲突判定先比对内容
This commit is contained in:
1 parent
6cb10db375
commit
a5d9f0bfee
2 files changed
+24
-10
No files matched your search
+16
-7
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user