Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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_Promise_Sequelize.js - Fatal编程技术网

Mysql nodejs操作中的事务管理

Mysql nodejs操作中的事务管理,mysql,node.js,promise,sequelize.js,Mysql,Node.js,Promise,Sequelize.js,我需要在服务层实现事务管理。Nodejs、sequelize和mysql是我正在使用的技术。所有crud操作都从db层调用到服务层。在这里,我需要通过从两个单独的db层调用来在服务层中执行两个insert操作。我已经在我的项目中实现了sequelize事务管理。我的问题是,我无法在单个事务下管理2个插入操作。原因是,我需要从第一次成功插入中收集一些数据。这样我就可以称之为“然后”行动。当我调用then操作时,事务被提交。那么,我们应该如何使之成为可能呢 公共\u数据库\u处理程序\u文件 表1\

我需要在服务层实现事务管理。Nodejs、sequelize和mysql是我正在使用的技术。所有crud操作都从db层调用到服务层。在这里,我需要通过从两个单独的db层调用来在服务层中执行两个insert操作。我已经在我的项目中实现了sequelize事务管理。我的问题是,我无法在单个事务下管理2个插入操作。原因是,我需要从第一次成功插入中收集一些数据。这样我就可以称之为“然后”行动。当我调用then操作时,事务被提交。那么,我们应该如何使之成为可能呢

公共\u数据库\u处理程序\u文件

表1\u数据库\u处理程序\u文件

表2\u数据库\u处理程序\u文件

服务层文件


必须将事务传递到您在数据库处理程序中执行的操作中

this.insertData = function(collectionObject, collectionName, t1) {
    var collection = MODELS[collectionName];
    return collection
      .create(collectionObject, { transaction: t1 });
  };
为了实现上述功能,您可以将事务作为参数从服务层传递到数据库层

同样在上面的实现中,事务不是调用函数,而是分配函数。下面是它实际外观的示例

this.createUser = function(data1) {
    return sequelize.transaction(function (t1) { 
        return firstDBfunction(data1, t1)
            .then(function(response){
               return secondDBFunction(data2 , t1);
            });
    }).then(function(response){
        //transaction successful
    }).catch(function(error){
        //transaction failed, so auto ROLLBACK
    });
}

根据文档,在其中进行查询时,您似乎需要指定事务:在您的情况下,您可能需要将事务传递给句柄,并在使用sequelize(在通用句柄中)进行实际查询时包含它。是否有机会通过使用或其他类似的方法解决此问题。看起来您可以创建命名空间以避免传递事务引用。选中我上面粘贴的链接上的“自动将事务传递到所有查询”部分。在此之后,您只需在事务内返回一个承诺,并
解析
拒绝
它即可提交或回滚事务。如果我在第一次和第二次db调用之间调用另一个select查询,但不调用事务对象,它是否会影响当前事务。否,只有传递事务对象的sequelize查询才会生效。
this.create = function (data2) {
     return commonHandler.insertData(data2,"table2")
}
sequelize.transaction(function (t1) {

  //saving data to table1
  this.createUser = function (data1) {
    table1Handler.create(data1)
        .then(function (response) {
           if (response) {
             var data2 = {};
             data2.id = response.id; 

             //saving data to table2
             table2Handler.create(data2)
               .then(function (data2) {
                 console.log("success);
                }


            }
         }
         .catch(error => {
          new Error();
          console.log("Failed");
          }
  }

});
this.insertData = function(collectionObject, collectionName, t1) {
    var collection = MODELS[collectionName];
    return collection
      .create(collectionObject, { transaction: t1 });
  };
this.createUser = function(data1) {
    return sequelize.transaction(function (t1) { 
        return firstDBfunction(data1, t1)
            .then(function(response){
               return secondDBFunction(data2 , t1);
            });
    }).then(function(response){
        //transaction successful
    }).catch(function(error){
        //transaction failed, so auto ROLLBACK
    });
}