mysql js pool会导致事务死锁

时间:2017-07-28 07:50:32

标签: mysql node.js

我正在使用NodeJS和Mysql-Promise设计一个票务系统 为了安全和一致,我想使用Transaction,但我担心死锁 场景是

  
      
  1. 人们可以一次购买多张票
  2.   
  3. 我会检查每张票是否剩余的票数是否足够。
  4.   
  5. 我更新了门票数量
  6.   
  7. 我创建了订单
  8.   

代码是

        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()

由于

0 个答案:

没有答案