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表,两个请求同时进来,结果是更新了两条数据
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
READ_UNCOMMITTED
并不能阻止吧,请求1读取table1
,请求2读取table1
,请求1更新table1
,请求2更新table1
。