sequelize开启事物后隔离级别级别设置成可以脏读,但是没有读到数据问题

数据库中有一张表,我先读这张表,如果有符合条件的不进行任何操作,直接返回,如果没有,更新一条数据,现在是如果两个请求进来,它俩都没有读到符合条件的数据,而期望的结果是,第一条请求没有读到,会更新一条,第二条请求应该要读到第一条插入的结果。根据网友的建议,我开启了事务,设置成可以脏读,但是结果还是一样,下面上代码:

        sequlize.transaction({ autocommit: true, isolationLevel: sequlize.Transaction.ISOLATION_LEVELS.READ_UNCOMMITTED }, async function (t) {
            //事务业务
            return sequlize.models.chat_user.findOne({ where: { url: data.url, have_vest: 1, vest_name: data.vest_name, online: 1, room: room }, raw: true, transaction: t })
                .then(function (vest) {
                    if (vest) {
                        io.sockets.connected[socket.id].emit('rob_vest', { success: false, message: 'not avilable vest' })
                        // return sequlize.Promise.reject();
                        return
                    }
                    return sequlize.models.used_vest.findOne({ where: { phone, room, url }, raw: true, transaction: t })
                        .then(async function (cool_vest) {
                            //判断是否在冷却时间
                            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 })
                            }
                            return 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, transaction: t })
                                .then(function (update_user) {
                                    console.log('更新用户')
                                    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 })

                                    }
                                })
                        })
                });
        }).then(function (results) {
            /* 操作成功,事务会自动提交 */
            console.log('事务提交')
        }).catch(function (err) {
            /* 操作失败,事件会自动回滚 */
            throw err
            console.log('抢马甲失败', err)
        });;
    },

操作的表是chat_user表,两个请求同时进来,结果是更新了两条数据

阅读 3k
1 个回答

READ_UNCOMMITTED并不能阻止吧,请求1读取table1,请求2读取table1,请求1更新table1,请求2更新table1

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题