【问题标题】:Is there any reason to use Promise.all in a TypeORM transaction?有任何理由在 TypeORM 事务中使用 Promise.all 吗?
【发布时间】:2021-12-11 05:37:54
【问题描述】:

我正在使用 TypeORM 在一个事务中执行两个操作。他们的订单没有任何意义。
使用 Promise.all 真的会更快,还是命令在内部排队?

基本上,这2个选项的效率有区别吗?

// Option 1
getManager().transaction(async manager => {
  await Promise.all([
    manager.insert(...),
    manager.update(...),
  ]);
});;

// Option 2
getManager().transaction(async manager => {
  await manager.insert(...);
  await manager.update(...);
});

澄清一下,我知道Promise.all 由于单线程逻辑和事件循环等等,总体上可以大大提高 JavaScript 的性能。
我在同一个事务管理器中专门询问 TypeORM 和多个查询,因为它们似乎按顺序运行,无论是否涉及 Promise.all

【问题讨论】:

  • 您是否希望您的插入和更新并行运行?这似乎与 typeorm AFAICS 无关
  • 如果是MySQL:一个连接只能执行1个查询,一个事务只能发生在一个连接上。如果您使用事务,您可能必须按顺序执行操作。

标签: typescript typeorm


【解决方案1】:

TypeORM 通过为您创建查询来帮助您。如果你用 DB 做两件事,一般来说这将是对数据库的两次查询。假设创建一个客户并创建一个发票记录。如果你使用promise all,它会更快。但是你必须确保请求之间没有任何依赖关系。

示例:发票需要之前创建的客户。

但如果它们是独立的请求,您可以使用 promise all。然后您可以检查每个请求是否正常,如果正常,则可以提交事务,否则回滚。

我希望你觉得这很有用,如果你要求其他的东西,请提供更多的背景,以便我可以更好地帮助你。

【讨论】:

    【解决方案2】:

    TypeOrm 不能与 promise.all 和事务 (https://github.com/typeorm/typeorm/issues/1014) 一起正常工作。是的,使用 promise all 会更快,但事务将不起作用。

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 2020-06-13
    • 1970-01-01
    • 2022-12-11
    • 2016-06-16
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多