在 forEach 问题中对事务进行后续处理

Posted

技术标签:

【中文标题】在 forEach 问题中对事务进行后续处理【英文标题】:Sequelize transactions inside forEach issue 【发布时间】:2020-08-05 17:18:09 【问题描述】:

我试图将这两个查询包装在这样的事务中

const transaction = await db.sequelize.transaction()
try 
    await Table1.create(
        name: data.name
    , transaction);

    trainees.foreach(async trainee => 
        await Table2.create(
            name: trainee.name
        , transaction);
    )

    await transaction.commit();
    api.publish(source, target, false, message: `Data successfully saved`);
 catch (error) 
    await transaction.rollback();
    api.error(source, target, 
        message: error.message || `Unable to save data`
    );

第一个查询已执行,但第二个查询出现以下错误。

commit has been called on this transaction(2f8905df-94b9-455b-a565-803e327e98e1), you can no longer use it. (The rejected query is attached as the 'sql' property of this error)

【问题讨论】:

【参考方案1】:

试试这个:

try 
  await db.sequelize.transaction(async transaction => 
    await Table1.create(
        name: data.name
    , transaction);

    // you should await each iteration
    // forEach function of an Array object can't do it
    for (const trainee of trainees) 
      await Table2.create(
          name: trainee.name
      , transaction);
    
    await Table3.create(
        name: data.name
    , transaction);

    api.publish(source, target, false, message: `Data successfully saved`);
  )
 catch (error) 
    api.error(source, target, 
        message: error.message || `Unable to save data`
    );

【讨论】:

嗨@Anatoly 感谢您的回答。我刚刚发现我的代码的实际问题并编辑了问题。也许您也可以根据我更新的问题更新您的答案。 什么是实习生?数组还是类集合对象? 对象数组

以上是关于在 forEach 问题中对事务进行后续处理的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Laravel 的双 foreach 循环中对数据进行排序

如何在 PHP/Eclipse 中对 foreach 循环中从数组中拉出的自定义对象进行智能感知?

for 与forEach的区别

如何在 MySql 中对事务提交超时进行单元测试?

增强for

foreach用法