Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在Nodejs中执行不同的批插入到一个事务中_Mysql_Node.js_Mariadb - Fatal编程技术网

Mysql 在Nodejs中执行不同的批插入到一个事务中

Mysql 在Nodejs中执行不同的批插入到一个事务中,mysql,node.js,mariadb,Mysql,Node.js,Mariadb,我需要为两个不同的集合执行两个不同的插入,一个依赖于另一个,因此我需要执行第一个插入,然后能够执行第二个插入。我的问题是,如果发生错误,我需要能够回滚所有操作,因此如果发生错误,我需要回滚两个插入 我试图在事务内部用我的两个批处理调用来做类似的事情,但它不起作用 conn.beginTransaction() .then(() => { conn.query("INSERT INTO testTransaction values ('test')");

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

我试图在事务内部用我的两个批处理调用来做类似的事情,但它不起作用

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();
  })

有没有关于如何做到这一点的例子?

如果有人有同样的情况,并且知道我如何解决这个问题,下面是一个有效的代码:

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

如果你有很多承诺需要等待,你可以使用:


我需要等到insert1完成后才能执行insert2,这就是为什么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();
  })