Sequelize - 在事务中插入多个关联实体失败
Sequelize - Inserting multiple associated entities in transaction fails
我有两个模型:Status 和 StatusParameter。 Status 'hasMany()' StatusParameter 和 StatusParameter 'belongsTo()' 状态。我想插入一个 Status 记录,然后插入多个与新 Status 关联的 StatusParameter 实体。我也想将所有插入内容包装在一个事务中。我正在使用 Sequelize 2.0.5,所以这是我想出的:
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);
});
执行此代码片段将始终进入回滚场景,堆栈跟踪指向 dialects/mssql/query.js 第 66 行,并显示一条错误消息:无法读取 属性 'emit'未定义
我不知道为什么会这样,我查看了 query.js 代码,但无法理解为什么在这种情况下未定义 promise 变量,尤其是如果我只插入一个新的 StatusParameter 实体,所有工作正常。当我插入多个关联实体时,确实会出现错误。
谢谢!
菲尔
我尝试了最新的 sequelize 标签(未发布),当时是 2.1.0,正如 Jan 所建议的那样,它工作得很好,但我只需要使用 Promise.map 和 {concurrency:1}而不是 Promise.all 因为乏味(我在 MS SQL 服务器数据库上)抱怨并发执行两个查询,稍后会研究它是否可以同时添加它们并获得一点性能提升.谢谢@jan!!
我有两个模型:Status 和 StatusParameter。 Status 'hasMany()' StatusParameter 和 StatusParameter 'belongsTo()' 状态。我想插入一个 Status 记录,然后插入多个与新 Status 关联的 StatusParameter 实体。我也想将所有插入内容包装在一个事务中。我正在使用 Sequelize 2.0.5,所以这是我想出的:
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);
});
执行此代码片段将始终进入回滚场景,堆栈跟踪指向 dialects/mssql/query.js 第 66 行,并显示一条错误消息:无法读取 属性 'emit'未定义
我不知道为什么会这样,我查看了 query.js 代码,但无法理解为什么在这种情况下未定义 promise 变量,尤其是如果我只插入一个新的 StatusParameter 实体,所有工作正常。当我插入多个关联实体时,确实会出现错误。
谢谢! 菲尔
我尝试了最新的 sequelize 标签(未发布),当时是 2.1.0,正如 Jan 所建议的那样,它工作得很好,但我只需要使用 Promise.map 和 {concurrency:1}而不是 Promise.all 因为乏味(我在 MS SQL 服务器数据库上)抱怨并发执行两个查询,稍后会研究它是否可以同时添加它们并获得一点性能提升.谢谢@jan!!