首页 > 解决方案 > 什么是/如何使用 NODEjs 中的 neo4j-driver 将多个 tx.run 作为单个事务编写?

问题描述

我正在尝试同步两个数据库,对于每种类型的操作,我希望它是一个完整的事务,我已经设置了一些相当基本的东西,但我不确定这是否会作为单个事务实际运行和回滚。我一直在查看文档,但 NodeJS 的文档相当稀缺。

我的示例代码:

 const tx = session.beginTransaction();

  SyncElements(doc.lists.elements, existingElements, tx);

  tx.commit()
    .then(res => {
      console.log('SYNC ELEMENTS SUCCESSFUL, RESULT:', res);
    })
    .catch(err => {
      console.error('COULD NOT SYNC ELEMENTS TRANSACTION FAILURE: ', err);
    });

现在在SyncElements()获取 tx 对象的函数中,它将调用tx.run(数十次。

我的问题是,这几十个tx.run电话,它们都会被视为我上面提交的主要交易的一部分吗?如果这些调用中的任何一个失败,所有使用该 tx. 对象被反转?

编辑:我的第二次尝试:

我的每一次运行都返回了这样的承诺:

  deleteElements.forEach(el => {
    allOperations.push(deleteElement(el, tx));
  });

接着


const deleteElement = (
  el: Element,
  tx: neo4j.default.Transaction,
): Promise<neo4j.default.StatementResult> => {
  return tx.run(`MATCH... STATEMENT`);
};

我将它们存储在一个数组中,然后运行:

try {
    await Promise.all(allOperations);
    await tx.commit();
    return;
  } catch (err) {
    await tx.rollback();
    console.error('COULD NOT SYNC ELEMENTS TRANSACTION FAILURE: ', err);
  }

我认为这与文档更接近?我想在我的第一次尝试中我真的没有办法回滚事务所以只是假设如果有错误它不会提交?

标签: node.jsneo4jacidneo4j-node

解决方案


推荐阅读