事务处理速度太快导致数据出错?

2016-04-23 10:01:26 +08:00
 LiuXuFei
有两个 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'});
});
});
});
});
3740 次点击
所在节点    Node.js
6 条回复
agui2200
2016-04-23 10:49:43 +08:00
加锁
LiuXuFei
2016-04-23 11:13:12 +08:00
LiuXuFei
2016-04-23 11:15:18 +08:00
第二个问题有什么好的解决方式吗?
hcymk2
2016-04-23 11:30:00 +08:00
count = a_count + 1
这个不能直接在 sql 里面做么?
zhaohui318
2016-04-23 11:36:06 +08:00
拿着锁 sleep 1000ms
LiuXuFei
2016-04-23 12:29:50 +08:00
@hcymk2 多个地方用注意统一

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/273820

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX