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