【问题标题】:Bluebird promise and Sequelize simulate transaction atomicityBluebird Promise 和 Sequelize 模拟事务原子性
【发布时间】:2015-02-08 04:56:30
【问题描述】:

我正在使用 bluebird.js promise 和 sequelize.js 来模拟我网站上的交易。 基本上我尝试在 processTransactions 中做一些事情,如果一切正常,我将 t.commit() 事务,否则我将 t.rollback() 事务。

另外,我正在使用 bluebird.js 承诺进行控制流。这是代码:

var processTransactions = function(transactionmain, transactionlist, t){
    // code to process transactions
};


var processtransaction = function(transaction_id)  {

  // t need to be passed in so we can choose 
  // t.commit() or t.rollback() the transaction
  sequelize.transaction(function(t){

    return Promise.resolve({}).bind({transactionmain: [...], transactionlist: [...]})
    .then(function(){
        return [this.transactionmain, this.transactionlist, t];
    })
    .spread(processTransactions)
    .then(function(){
        t.commit().success(function() {})
    })
    .catch(function(err){
        t.rollback().success(function() {})
    });

  }).error(function(err){
    t.rollback().success(function() {})
  });
};

我的问题是,如果我不将 t 参数传递给 processTransactions 那么函数可以执行但不能实现原子性。如果我通过了 t 那么程序就会停在那里。

有人知道发生了什么吗?谢谢。

【问题讨论】:

  • 您是说简单地传递t 会导致问题还是取决于tprocessTransactions() 中的使用方式?
  • 我不知道你认为thisthen 中的设置是什么(在this.trasnactiondomain 中),但这没有任何意义。试试Promise.resolve().bind(this).then(...
  • @Roamer-1888 是的,当我通过 t 然后程序停在那里。
  • @BenjaminGruenbaum 你说得对,我确实将某些东西与承诺绑定在一起。
  • 我不确定我是否能很好地理解您的问题 - 如果您的代码被卡住,那么要么承诺无法解决,要么您有竞争条件。请考虑从以前从未见过您的代码的人的角度重新阅读您的问题 - 我很难理解具体是什么问题。

标签: node.js transactions promise sequelize.js bluebird


【解决方案1】:

我想我在这里找到了答案... https://github.com/sequelize/sequelize/issues/1510

我认为错误是因为事务不是承诺,因此承诺无法正常工作。如果我使用 bluebird promisify 交易功能,那么它将起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2012-11-08
    相关资源
    最近更新 更多