Обещание Bluebird и Sequelize имитируют атомарность транзакций

Я использую обещания bluebird.js и secleize.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, программа остановится на этом.

Кто-нибудь знает, что происходит? Спасибо.


person Shih-Min Lee    schedule 10.12.2014    source источник
comment
Вы говорите, что просто передача t вызывает проблему, или это зависит от того, как t используется в processTransactions()?   -  person Roamer-1888    schedule 10.12.2014
comment
Я не знаю, что, по вашему мнению, установлено в this в thenthis.trasnactiondomain), но это ничего не значит. Попробуйте Promise.resolve().bind(this).then(...   -  person Benjamin Gruenbaum    schedule 10.12.2014
comment
@ Roamer-1888 да, когда я передаю t, программа останавливается на этом.   -  person Shih-Min Lee    schedule 11.12.2014
comment
@BenjaminGruenbaum, ты прав, я кое-что привязал к обещанию.   -  person Shih-Min Lee    schedule 11.12.2014
comment
Я не уверен, что очень хорошо понимаю вашу проблему - если ваш код зависает, то либо обещание не разрешается, либо у вас есть состояние гонки. Пожалуйста, попробуйте перечитать свой вопрос с точки зрения того, кто никогда раньше не видел ваш код - мне трудно понять, в чем конкретно заключается проблема.   -  person Benjamin Gruenbaum    schedule 11.12.2014
comment
понятно. Сначала я постараюсь уменьшить/пересмотреть код!   -  person Shih-Min Lee    schedule 11.12.2014
comment
Если бы вы написали ... .spread(function(transactionmain, transactionlist) { /* code to process transactions */ }). ..., то t не нужно было бы передавать - он будет доступен из замыкания, сформированного внешней функцией. Предлагаем вам попробовать это, хотя бы для диагностики. Если это все еще не работает, вы должны подозревать код транзакций процесса.   -  person Roamer-1888    schedule 11.12.2014


Ответы (1)


Я думаю, что нашел ответ здесь... https://github.com/sequelize/sequelize/issues/1510

Я думаю, что ошибка в том, что транзакция не является обещанием, поэтому обещание не может работать правильно. Если я использую bluebird, обещаю функцию транзакции, тогда она будет работать.

person Shih-Min Lee    schedule 10.01.2015