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

发布于 2022-09-07 21:17:24 字数 2715 浏览 13 评论 0

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

        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表,两个请求同时进来,结果是更新了两条数据

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

呢古 2022-09-14 21:17:24

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文