【问题标题】:Sequelize - Inserting multiple associated entities in transaction failsSequelize - 在事务中插入多个关联实体失败
【发布时间】:2015-04-29 21:44:09
【问题描述】:

我有两个模型:Status 和 StatusParameter。 Status 'hasMany()' StatusParameter 和 StatusParameter 'belongsTo()' 状态。我想插入一条状态记录,然后插入多个与新状态关联的 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);
    });

执行此代码 sn-p 将始终进入回滚场景,堆栈跟踪指向 dialects/mssql/query.js 第 66 行并显示错误消息:无法读取未定义的属性 'emit'

我不知道为什么会这样,我查看了 query.js 代码,但无法理解为什么在这种情况下未定义 promise 变量,尤其是如果我只插入一个新的 StatusParameter 实体,一切正常。当我插入多个关联实体时,确实会出现错误。

谢谢! 菲尔

【问题讨论】:

  • Sequelize 最近删除了事件发射器支持,但它仍然存在于 2.0.5 中。您是否尝试过重新安装 sequelize 和依赖项?
  • 我的错,我忘了尝试最新的标签。 2.1.0,它工作得很好。我只需要将 Promise.map 与 {concurrency:1} 一起使用,而不是 Promise.all,因为乏味抱怨同时执行两个查询,稍后将查看是否可以同时添加它们并获得一点性能提升。谢谢@jan!!

标签: transactions associations sequelize.js


【解决方案1】:

我尝试了最新的 sequelize 标签(不是发布),当时是 2.1.0,正如 Jan 所建议的,它工作得很好,但我只需要使用带有 {concurrency:1} 的 Promise.map 而不是 Promise。因为乏味(我在 MS SQL Server DB 上)一直在抱怨同时执行两个查询,所以稍后会研究一下,看看我是否可以同时添加它们并获得一点性能提升。谢谢@jan!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多