nodejs的Promises操作中的事务管理

时间:2018-04-04 14:47:05

标签: mysql node.js promise sequelize.js

我需要在服务层实现事务管理。 Nodejs,sequelize和mysql是我正在使用的技术。所有crud操作都从db层调用到服务层。这里我需要通过从2个单独的数据库层调用在服务层中进行2次插入操作。我已经在我的项目中实施了sequelize事务管理。我的问题是,我无法在单个事务下管理2个插入操作。为什么因为,我需要从第一次成功插入中收集一些数据。所以我可以称之为“然后”操作。当我调用then操作时,事务已经提交。那怎么能让它成为可能呢。

  

common_database_Handler_file

this.insertData = function(collectionObject, collectionName) {
    var collection = MODELS[collectionName];
    return collection
      .create(collectionObject);
  };
  

table1_database_Handler_file

this.create = function (data1) {
     return commonHandler.insertData(data1,"table1")
}
  

table2_database_Handler_file

this.create = function (data2) {
     return commonHandler.insertData(data2,"table2")
}
  

service_layer_file

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

});

1 个答案:

答案 0 :(得分:1)

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

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