V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LiuXuFei
V2EX  ›  Node.js

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

  •  
  •   LiuXuFei · 2016-04-23 10:01:26 +08:00 · 3562 次点击
    这是一个创建于 2930 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有两个 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'});
    });
    });
    });
    });
    6 条回复    2016-04-23 12:29:50 +08:00
    agui2200
        1
    agui2200  
       2016-04-23 10:49:43 +08:00   ❤️ 1
    加锁
    LiuXuFei
        2
    LiuXuFei  
    OP
       2016-04-23 11:13:12 +08:00
    LiuXuFei
        3
    LiuXuFei  
    OP
       2016-04-23 11:15:18 +08:00
    第二个问题有什么好的解决方式吗?
    hcymk2
        4
    hcymk2  
       2016-04-23 11:30:00 +08:00
    count = a_count + 1
    这个不能直接在 sql 里面做么?
    zhaohui318
        5
    zhaohui318  
       2016-04-23 11:36:06 +08:00
    拿着锁 sleep 1000ms
    LiuXuFei
        6
    LiuXuFei  
    OP
       2016-04-23 12:29:50 +08:00
    @hcymk2 多个地方用注意统一
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2292 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:44 · PVG 17:44 · LAX 02:44 · JFK 05:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.