【问题标题】:TypeORM transaction with query builder带有查询生成器的 TypeORM 事务
【发布时间】:2021-10-12 07:25:24
【问题描述】:

我对@9​​87654321@ 交易有一些疑问。 所以我的代码如下:

  public createOrderTransaction = async (
    data: CreateOrderInputDTO,
  ): Promise<Order> => {
    const queryRunner = this.connection.createQueryRunner();
    await queryRunner.startTransaction();
    try {
      const order = await this.createOrder(data);
      await this.createOrderRecord(order.id, data);
      await queryRunner.commitTransaction();
      return order;
    } catch (error) {
      this.logger.error(
        "Transaction Error: 'createOrderTransaction' is failed: ",
        error,
      );
      if (queryRunner.isTransactionActive) {
        await queryRunner.rollbackTransaction();
      }
    }
  };

createOrder 这样的一个函数使用查询生成器:

private createOrder = async (data: CreateOrderInputDTO): Promise<Order> => {
    const { identifiers } = await this.orderRepository
      .createQueryBuilder('order')
      .insert()
      .into(Order)
      .values([data])
      .execute();

    await this.saveOrderDetail(identifiers[0].id, data.orderDetails);

    await this.orderRepository
      .createQueryBuilder('order')
      .relation(Order, 'orderDetails')
      .of(identifiers[0].id)
      .add(data.orderDetails);

    return this.getOrder(identifiers[0].id);
  };

但是当我尝试它时,如果它在逻辑中间触发了一些错误,则回滚不起作用。 在我看来,query builder 似乎不支持事务。 那么有什么方法可以将quert buildertransaction 一起使用?

【问题讨论】:

    标签: transactions nestjs typeorm query-builder


    【解决方案1】:

    自我回答... 在我查看 TypeORM index.d.ts 之后,我认为 createQueryBuilder 中有一些参数名为 queryRunner 所以。如果您在那里输入您自己的查询运行器进行交易,您可以使用queryBuilderqueryRunner

    如:

      public createOrderTransaction = async (
        data: CreateOrderInputDTO,
      ): Promise<Order> => {
        const queryRunner = this.connection.createQueryRunner();
    
        await queryRunner.connect();
        await queryRunner.startTransaction();
        try {
          const order = await this.createOrder(data, queryRunner);
          await this.createOrderRecord(order.id, data, queryRunner);
          await queryRunner.commitTransaction();
          return order;
        } catch (error) {
          this.logger.error(
            "Transaction Error: 'createOrderTransaction' is failed: ",
            error,
          );
          if (queryRunner.isTransactionActive) {
            await queryRunner.rollbackTransaction();
          }
        }
      };
    

    createOrder 就像:

     private createOrderRecord = async (
        orderId: string,
        data: CreateOrderInputDTO,
        queryRunner?: QueryRunner,
      ): Promise<void> => {
        await this.orderRecordRepository
          .createQueryBuilder('order_record', queryRunner)
          .insert()
          .into(OrderRecord)
          .values([
            {
              ...data,
              orderId,
              createdAt: new Date(),
            },
          ])
          .execute();
    
        await this.orderRecordRepository
          .createQueryBuilder('order_record', queryRunner)
          .relation(OrderRecord, 'orderDetails')
          .of(orderId)
          .add(data.orderDetails);
      };
    

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 2022-01-11
      • 2021-08-10
      • 2023-01-20
      • 2015-04-17
      • 1970-01-01
      • 2022-11-09
      • 2023-01-20
      • 2020-09-21
      相关资源
      最近更新 更多