From d0bff1f9b06f976a8b0079e88bed7028ef90145b Mon Sep 17 00:00:00 2001 From: wkj <278599135@.com> Date: Sun, 29 Sep 2024 14:41:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=A4=B1=E8=B4=A5=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=20=E5=BC=80=E5=90=AF=E6=96=B0=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/Synchronizer.js | 32 +++++++++++++++++++++----------- src/Synchronizer.ts | 36 +++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/lib/Synchronizer.js b/lib/Synchronizer.js index 9f5e8bf..0766880 100644 --- a/lib/Synchronizer.js +++ b/lib/Synchronizer.js @@ -50,17 +50,27 @@ class Synchronizer { } catch (err) { if (onFailed) { - await onFailed({ - remoteEntity: entity, - remoteEntityId: entityId, - data: queue.map((ele) => ({ - entity: ele.oper.targetEntity, - rowIds: ele.oper.filter.id.$in, - action: ele.oper.action, - data: ele.oper.data, - })), - reason: err, - }, context); + context.on('rollback', async () => { + const context2 = this.contextBuilder(); + context2.begin(); + try { + await onFailed({ + remoteEntity: entity, + remoteEntityId: entityId, + data: queue.map((ele) => ({ + entity: ele.oper.targetEntity, + rowIds: ele.oper.filter.id.$in, + action: ele.oper.action, + data: ele.oper.data, + })), + reason: err, + }, context2); + context2.commit(); + } + catch (err) { + context2.rollback(); + } + }); } throw err; } diff --git a/src/Synchronizer.ts b/src/Synchronizer.ts index fe88c07..c839540 100644 --- a/src/Synchronizer.ts +++ b/src/Synchronizer.ts @@ -92,19 +92,29 @@ export default class Synchronizer ({ - entity: ele.oper.targetEntity!, - rowIds: (ele.oper.filter as any).id.$in, // 暂时应该没什么用 - action: ele.oper.action!, - data: ele.oper.data!, - }) - ), - reason: err, - }, context); + context.on('rollback', async () => { + const context2 = this.contextBuilder(); + context2.begin(); + try { + await onFailed({ + remoteEntity: entity!, + remoteEntityId: entityId!, + data: queue.map( + (ele) => ({ + entity: ele.oper.targetEntity!, + rowIds: (ele.oper.filter as any).id.$in, // 暂时应该没什么用 + action: ele.oper.action!, + data: ele.oper.data!, + }) + ), + reason: err, + }, context2); + context2.commit(); + } + catch (err) { + context2.rollback(); + } + }); } throw err; }