2015-04-27 69 views
0

我有兩種模式:Status和StatusParameter。狀態'hasMany()'StatusParameter和StatusParameter'belongsTo()'狀態。我想插入一個狀態記錄,然後插入與新狀態關聯的多個StatusParameter實體。我想要將所有的插入包裝在一個事務中。我使用Sequelize 2.0.5,所以這裏是我想出了:Sequelize - 在事務中插入多個關聯實體失敗

return sequelize.transaction(function(t) { 
    return Status.create({name: 'abc', value: 1 }, {transaction: t}).then(function(instance) { 
     return sequelize.Promise.all(
      [sequelize.models.StatusParameter.create({statusId:instance.id, name: 'myParamName', value:123}, {transaction: t}), 
      sequelize.models.StatusParameter.create({statusId:instance.id, name: 'myOtherParamName', value:345}, {transaction: t}) 
      ]); 
     }); 
    }).then(function(){ 
     // Automatically comitted at this point if the promise chain returned to the transaction successfully resolved 
     callback(); 
    }).catch(function(err){ 
     // Automatically rolledback at this point if the promise chain returned to the transaction was rejected 
     callback(err); 
    }); 

執行該代碼段將始終回滾方案得到一個堆棧跟蹤指向方言/ MSSQL/query.js 66行與一個錯誤消息說明:無法讀取屬性'發射'未定義

我不知道爲什麼我得到這個,我看着query.js代碼,但無法確定爲什麼在這種情況下,promise變量未定義,特別是如果我只插入一個新的StatusParameter實體,所有工作正常。它真的當我插入多個關聯的實體時,出現錯誤。

謝謝! Phil

+0

Sequelize最近刪除了事件發射器支持,但它仍然存在於2.0.5中。你有沒有嘗試重新安裝sequelize和依賴關係? –

+0

我的不好,我忘了試試最新的標籤。 2.1.0,它工作得很好。我只需要使用帶有{concurrency:1}而不是Promise.all的Promise.map,因爲單調乏味的抱怨同時執行兩個查詢,稍後會研究它是否可以同時添加它們並獲得一點性能提升。謝謝@jan! –

回答

0

我嘗試了當時2.1.0的最新sequelize標籤(不是發行版),正如Jan建議的那樣,它工作的很好,但我只需要使用帶有{concurrency:1}的Promise.map Promise.all(因爲我在MS SQL Server數據庫上)抱怨同時執行兩個查詢,稍後會查看它是否可以同時添加它們並獲得一點性能提升。謝謝@jan!