Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Transactions 当我必须向外部API发出请求时,如何执行事务?_Transactions_Nestjs_Typeorm_Rollback_Stripe Api - Fatal编程技术网

Transactions 当我必须向外部API发出请求时,如何执行事务?

Transactions 当我必须向外部API发出请求时,如何执行事务?,transactions,nestjs,typeorm,rollback,stripe-api,Transactions,Nestjs,Typeorm,Rollback,Stripe Api,我正在开发购物车功能,对于付款处理,我正在使用stripe 我担心的是:我听说我们应该避免长时间运行的事务以避免整个数据库死锁?对此不确定,但这就是为什么我想更好地理解它 我正在使用TypeORM、MySQL、Nest.js作为我的后端。 对于付款处理,我使用stripe 这意味着我需要执行请求(从用户那里获得付款),但有些事情可能会发生。例如,可能是资金不足、服务器端错误 我担心这个请求是否应该成为交易的一部分?在条带响应成功时,我必须在数据库中创建记录,在响应失败时,我必须回滚所有内容 有很

我正在开发购物车功能,对于付款处理,我正在使用stripe

我担心的是:我听说我们应该避免长时间运行的事务以避免整个数据库死锁?对此不确定,但这就是为什么我想更好地理解它

我正在使用TypeORM、MySQL、Nest.js作为我的后端。 对于付款处理,我使用stripe

这意味着我需要执行请求(从用户那里获得付款),但有些事情可能会发生。例如,可能是资金不足、服务器端错误

我担心这个请求是否应该成为交易的一部分?在条带响应成功时,我必须在数据库中创建记录,在响应失败时,我必须回滚所有内容

有很多东西可能会出问题——售出的物品可能会缺货

这是一个演示,显示了我想要执行的操作:

@Controller('orders')
@UsePipes(new ValidationPipe({ transform: true }))
@UseInterceptors(ClassSerializerInterceptor)
export class OrdersController {
  constructor(
    private readonly cartsService: CartsService,
    private readonly ordersService: OrdersService,
    private readonly ticketsService: TicketsService,
    private connection: Connection,
  ) {}

  @Post()
  async fullfilOrder(@Body() dto: CreateOrderDto) {
    
    // Get cart for checking the integrity
    const cart = await this.cartsService.findByPublicId(dto.cart.publicId);

    // Calculate payable amount
    const pricePerCompetition = cart.cartItems.map(
      item => item.quantity * item.competition.entryPrice,
    );

    const amount =
      pricePerCompetition.length === 0
        ? 0
        : pricePerCompetition.reduce((a, b) => a + b);

    // charge user
    const stripeCharge = await this.ordersService.submitStripeCharge(
      dto.stripeToken,
      amount,
      cart,
      { firstName: dto.firstName, lastName: dto.lastName, email: dto.email },
    );

    // create order
    const order = await this.ordersService.createOrder(
      cart,
      dto,
      stripeCharge.id,
    );

    // mark cart status as fulfiled
    cart.status = EnumerableCartStatus.FULFILED;
    await cart.save();

    // create ticket
    const ticket = await this.ticketsService.addUserTickets(
      AddTicketsDto.fromSuccessfulPayment(
        cart.user,
        dto.firstName,
        dto.lastName,
        dto.email,
        cart.cartItems,
      ),
    );

    //create new cart for user
    const newCart = new Cart();
    newCart.publicId = v4();
    newCart.user = cart.user;
    newCart.cartItems = [];
    await newCart.save();

    delete newCart.user;

    return { cart: newCart };
  }
}
任何想法,我需要什么方法来应对这种情况? 我读过queryRunner:但这让我想到了我正在执行的条带请求,将其作为事务的一部分是不明智的