【问题标题】:Executing different batch inserting into one transaction in Nodejs在Nodejs中执行不同的批处理插入到一个事务中
【发布时间】:2021-07-09 13:50:11
【问题描述】:

我需要为两个不同的集合执行两个不同的插入,一个依赖于另一个,所以我需要执行第一个,然后才能执行第二个。我的问题是,如果发生错误,我需要能够回滚所有操作,所以如果发生错误,我需要回滚两个插入。

我正在尝试对事务中的两个批处理调用执行类似的操作,但它不起作用。

conn.beginTransaction()
  .then(() => {
    conn.query("INSERT INTO testTransaction values ('test')");
    return conn.query("INSERT INTO testTransaction values ('test2')");
    //instead of this two query I have my batch inserts
  })
  .then(() => {
    conn.commit();
  })
  .catch((err) => {
    conn.rollback();
  })

有什么例子吗?

【问题讨论】:

    标签: mysql node.js mariadb


    【解决方案1】:

    如果你有很多需要等待的承诺,你可以使用Promise.all

    conn.beginTransaction()
      .then(() => {
        return Promise.all([
          conn.query("INSERT INTO testTransaction values ('test')"),
          conn.query("INSERT INTO testTransaction values ('test2')")
        ])
      })
      .then(() => {
        conn.commit();
      })
      .catch((err) => {
        conn.rollback();
      })
    

    【讨论】:

    • 我需要等到 insert1 完成才能执行 insert2,这就是为什么 Promise.All() 方法对我不起作用的原因。不过谢谢
    【解决方案2】:

    如果有人有同样的情况并且知道我如何解决这个问题,这里有一个工作代码:

    return connectionMaria.beginTransaction()
          .then(() => {
                  return conn.batch(insert1, values1)
                     .then(() => {
                        return conn.batch(insert2, values2) 
                      })
          .then(() => {
                         connectionMaria.commit();
                      })
          .catch((error) => {
                               connectionMaria.rollback();
                               throw error;
                             });
    

    【讨论】:

      猜你喜欢
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多