【问题标题】:Transaction management in Promises operations of nodejsnodejs的Promises操作中的事务管理
【发布时间】:2018-09-14 04:41:18
【问题描述】:

我需要在服务层实现事务管理。 Nodejs、sequelize 和 mysql 是我正在使用的技术。所有的 crud 操作都从 db 层调用到 service 层。在这里,我需要通过从 2 个单独的 db 层调用来在服务层中执行 2 次插入操作。我已经在我的项目中实施了 sequelize 事务管理。我的问题是,我无法在单个事务下管理 2 个插入操作。为什么因为,我需要从第一次成功插入中收集一些数据。这样我就可以调用“then”操作。当我调用 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");
          }
  }

});

【问题讨论】:

  • 根据文档显示,您需要在其中进行查询时指定事务:docs.sequelizejs.com/manual/tutorial/transactions.html 在您的情况下,您可能需要将事务传递给您的句柄并在进行实际操作时将其包含在内使用 sequelize 查询(在您的公共处理程序中)。
  • 是否有机会通过使用 promises 顺序或任何其他类似的东西来解决这个问题。
  • 看起来你可以创建一个命名空间来避免传递事务引用。检查我上面粘贴的链接上的“自动将事务传递给所有查询”部分。之后你只需要在事务中返回一个 Promise 并 resolvereject 它来提交或回滚事务。

标签: mysql node.js promise sequelize.js


【解决方案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
    });
}

【讨论】:

  • 如果我在第一个和第二个数据库调用之间调用另一个选择查询而没有事务对象,它会影响当前事务吗?
  • 不,只有你传递交易对象的sequelize查询才会生效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2018-09-06
  • 2023-03-25
  • 1970-01-01
  • 2016-12-02
  • 2012-10-07
  • 2012-04-28
相关资源
最近更新 更多