2017-08-31 73 views
0

我想通過我的async.parallel()使用託管的交易跟蹤交易。與async.parallel並列交易

現在,我這樣做:

return sequelize.transaction(function (t) { 
 
    return async.parallel([ 
 
     function(callback){ return func1(t, callback); }, 
 
     function(callback){ return func2(t, callback); } 
 
    ], function(err){ 
 

 
     if(err){ 
 
     ... 
 
     } 
 
    }); 
 
    }).then(function(){ 
 
    ... 
 
    }).catch(function(err){ 
 
    ...  
 
    });

如果func1func2在另一個之前發生故障,事務回滾。那麼接下來的兩個函數將嘗試使用該交易,但後來我得到這個錯誤:

Error: rollback has been called on this transaction(8b7f7cbc-b617-44fb-a9dd-906397e6f7ca), you can no longer use it.

這是有道理的。

將sequelize事務和async.parallel一起使用的推薦方法是什麼?

回答

0

我已經簡單地使用了非託管交易而不是託管交易,然後它就起作用了。

return sequelize.transaction().then(function (t) { 
 
    return async.parallel([ 
 
     function(callback){ return func1(t, callback); }, 
 
     function(callback){ return func2(t, callback); } 
 
    ], function(err){ 
 
     if(err){ 
 
     return t.rollback(); 
 
     } 
 
     
 
     return t.commit(); 
 
    }); 
 
    });

需要注意的是,現在我們在事務中使用sequelize.transaction().then(...),而不是一個回調函數。另請注意,t.rollback()會返回Promises,因此您可以使用.then()

更多信息:http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-