鍍金池/ 問答/數(shù)據(jù)庫  HTML/ sequelize開啟事物后隔離級(jí)別級(jí)別設(shè)置成可以臟讀,但是沒有讀到數(shù)據(jù)問題

sequelize開啟事物后隔離級(jí)別級(jí)別設(shè)置成可以臟讀,但是沒有讀到數(shù)據(jù)問題

數(shù)據(jù)庫中有一張表,我先讀這張表,如果有符合條件的不進(jìn)行任何操作,直接返回,如果沒有,更新一條數(shù)據(jù),現(xiàn)在是如果兩個(gè)請(qǐng)求進(jìn)來,它倆都沒有讀到符合條件的數(shù)據(jù),而期望的結(jié)果是,第一條請(qǐng)求沒有讀到,會(huì)更新一條,第二條請(qǐng)求應(yīng)該要讀到第一條插入的結(jié)果。根據(jù)網(wǎng)友的建議,我開啟了事務(wù),設(shè)置成可以臟讀,但是結(jié)果還是一樣,下面上代碼:

        sequlize.transaction({ autocommit: true, isolationLevel: sequlize.Transaction.ISOLATION_LEVELS.READ_UNCOMMITTED }, async function (t) {
            //事務(wù)業(yè)務(wù)
            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) {
                            //判斷是否在冷卻時(shí)間
                            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) {
                                        //搶馬甲成功向房間內(nèi)所有人廣播
                                        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) {
            /* 操作成功,事務(wù)會(huì)自動(dòng)提交 */
            console.log('事務(wù)提交')
        }).catch(function (err) {
            /* 操作失敗,事件會(huì)自動(dòng)回滾 */
            throw err
            console.log('搶馬甲失敗', err)
        });;
    },

操作的表是chat_user表,兩個(gè)請(qǐng)求同時(shí)進(jìn)來,結(jié)果是更新了兩條數(shù)據(jù)

回答
編輯回答
絯孑氣

READ_UNCOMMITTED并不能阻止吧,請(qǐng)求1讀取table1,請(qǐng)求2讀取table1,請(qǐng)求1更新table1,請(qǐng)求2更新table1。

2018年3月16日 01:58