我正在使用NodeJS和Mysql-Promise设计一个票务系统 为了安全和一致,我想使用Transaction,但我担心死锁 场景是
- 人们可以一次购买多张票
- 我会检查每张票是否剩余的票数是否足够。
- 我更新了门票数量
- 我创建了订单
醇>
代码是
await ctx.conn.beginTransaction()
// check amount of tickets
let ticketIdList = ctx.body.tickets.map(t => t._id)
let ticketList = await models.ticket.findTicketList(ctx.conn, ticketIdList)
for (let t in ticketList) {
let ticketBook = ctx.body.tickets.filter(tB => tB._id === t._id)
if (t.perMinSaleCount > ticketBook.count || t.perMaxSaleCount < ticketBook.count) {
ctx.stats = 400
return ctx.body = {
error: "FailTickets"
}
}
if (t.sold + ticketBook.count > t.total) {
ctx.stats = 400
return ctx.body = {
error: "SoldOut"
}
}
}
// update the tickets
await Promise.all(
ctx.body.tickets.map(t => models.ticket.reserveTicket(ctx.conn, t._id, t.count))
)
// create Order
await model.order.createOrder(...)
await ctx.conn.commit()
我最关心的是ctx.conn是按池创建的
mysql.createPool({
......
})
// await Promise.all(ctx.body.tickets.map(t => models.ticket.reserveTicket(ctx.conn, t._id, t.count)))
这行会在多连接中生成sql并导致死锁吗?
如何正确使用conn.beginTransaction()
?
由于