在Node JS中同时提交2件事时如何生成代码

时间:2019-04-18 08:36:20

标签: node.js insert generated-code

我有一个节点js,我想为activity_code生成代码,我想依次生成以下代码:LA0000000001,LA0000000002,LA0000000003等。我已经尝试过这种方法,但是在某些情况下,当我同时提交2个活动时,其中一个活动将丢失并且不提交,有时还会输入两倍并导致下一个活动的代码。我的代码有什么问题?谢谢您的帮助:)

this.insertMasterActivity = function(req, res) {
    var id = uuidv1();
    var activity_kode = null;
    var activity_subject = req.body.activity_subject;
    var created = new Date();

    connection.acquire(function(err, con) {
        con.query('select activity_kode from activities order by created desc limit 1', function(err, result) {
            con.release();
            if (err) {
                res.send({ status: 400, message: 'Activities Failed' });
            } else {
                // for generate activity_kode
                if (result.length != 0) {
                    var test = result[0].activity_kode;
                } else {
                    var test = "LA00000000000"
                }

                var pieces = test.split('LA');
                var lastNum = pieces[1];
                lastNum = parseInt(lastNum, 10);
                lastNum++;
                activity_kode = "LA" + ("00000000000" + lastNum).substr(-10);
                console.log(activity_kode);
                connection.acquire(function(err, con) {
                    con.query('INSERT INTO activities (id, activity_kode,activity_subject,created) VALUES (?,?,?,?)', [id, activity_kode, activity_subject, created], function(err, result) {
                        con.release();
                        // console.log(err);
                        if (err) {
                            res.send({ status: 400, message: 'creation failed' });
                        } else {
                            res.send({ status: 200, message: 'created successfully' });
                        }
                    });
                });
            };
        });
    });
}

1 个答案:

答案 0 :(得分:0)

我认为这就是所谓的比赛条件。我只知道两种解决方法。

  1. activity_kode更改为更独特的activity_kode。就像UUID。
  2. 使用信号量。

activity_kode更改为UUID比实现信号量更容易。信号量的概念就像带锁的门。如果门是锁着的,请勿进入,有人进入。放一些布尔型变量作为门,在生成activity_kode之前先检查门是否先锁住。

有很多实现它的方法,因为这是node.js问题,所以可以通过实现信号量的方式使用回调或异步等待。有人使用数据库中的标志字段,有人仅使用变量,有人使用空文件,有人使用纯文本文件,只包含1或0。

希望对您有帮助。