账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    sequelize 操作表时如何给表加锁保证一致性?
    30
    0

    聊天程序,用户可以抢马甲,如果两个用户同时抢,两个用户都会抢到这个马甲,如何让第一个用户操作表时阻塞这个表?

    像下面这样的逻辑我该如何使用事务呢?

      rob_vest: async function (data, socket) {
            let vest_time = Date.now()
            console.log('时间错', vest_time)
            let sequlize = await db
            let phone = data.phone
            let room = data.room
            let url = data.url
            //查询马甲是否有人在使用
            let vest = await sequlize.models.user_vest.findOne({ where: { url: data.url, have_vest: 1, online: 1, room: room }, raw: true })
            let cool_vest = await sequlize.models.used_vest.findOne({ where: { phone, room, url }, raw: true })
            if (vest) {
                io.sockets.connected[socket.id].emit('rob_vest', { success: false, message: 'not avilable vest' })
                return
            }
            //判断是否在冷却时间
            if (!cool_vest) {
                console.log('*userd_time', vest_time)
                let used_time = vest_time
                console.log('userddddddddtime------------------', used_time)
                let data = await sequlize.models.used_vest.create({ phone, room, url, used_time })
            } else {
                let begin_time = cool_vest.used_time + 60 * 60 * 2 * 1000
                let stop_time = begin_time + 60 * 60 * 2 * 1000
                console.log(begin_time, vest_time, stop_time, '8989898989898', vest_time < stop_time && begin_time < vest_time)
                if (begin_time < vest_time && vest_time < stop_time) {
                    io.sockets.connected[socket.id].emit('rob_vest', { success: false, msg: "马甲在冷却时间内不可以抢夺" })
                    return
                } else {
    
                    let used_time = vest_time
                    sequlize.models.used_vest.update({ used_time }, { where: { phone, room, url } })
                }
            }
            //更新用户信息
            let update_user = await sequlize.models.chat_user.update({ have_vest: 1, url: data.url, vest_name: data.vest_name, vest_time: vest_time, room: room }, { where: { phone }, raw: true })
            // let update_vest = sequlize.models.chat_vest.update({ is_used: 1, used_time: vest_time }, { where: { url: data.url }, raw: true })
            if (update_user) {
                //抢马甲成功向房间内所有人广播
                io.to(room).emit('rob_vest', { success: true, phone: phone })
                schedules.addListenVest(io)
            } else {
                //抢马甲失败,向用户自己广播失败
                io.sockets.connected[socket.id].emit('rob_vest', { success: false, phone: phone })
    
            }
            }
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部