事务处理速度太快导致数据出错?(已解决)
有两个 MySQL 数据库表 a 和 b a 有一个整型字段 a_count(此字段某些情况下归0) b 有一个整型字段 b_count
事务处理: 1、select 表 a,得到 a_count,然后计算 count = a_count + 1 2、update 表 a,a_count = count 3、insert 一条记录到表 b,b_count = count
想实现的的情况 count:1 2 3 4 5 6 7 1 2 3 4 5 6(第二个1是因为a_count归零了) 得到的真实情况 count:1 2 2 2 3 3 4 1 1 2 3 3 3(操作的速度太快导致数据重复)
问题一:有什么方式可以解决这样的问题? 问题二:解决了第一个问题,如果我想限制一个时间内(如:一秒)只能一次操作有哪些方式?
上代码(语言 Node.js,用得 orm 是 sequelize)
models.sequelize.transaction(function (t) {
// 查询表a数据
return models.A.findOne({
where: {
id: user_id,
},
transaction: t,
}).then(function (a) {
var count = a.a_count + 1;
// 事务:新增表b记录
return models.B.create({
b_count: count,
}, {transaction: t}).then(function () {
// 事务:更新表a数据
return models.A.update({
a_count: count,
}, {
where: {
id: user_id,
},
transaction: t,
}).then(function () {
res.json({success: 'success'});
});
});
});
});
4 回复
自己先写个 先入先出的队列来控制,等前一条返回ok,下一条再开始执行
@liuxufei sequelize的锁机制支持常见的4中隔离级别吗?
@jiangliqin sequelize支持锁机制,至于隔离级别是看数据库的支持,而不是sequelize的吧