我有一个节点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' });
}
});
});
};
});
});
}
答案 0 :(得分:0)
我认为这就是所谓的比赛条件。我只知道两种解决方法。
activity_kode
更改为更独特的activity_kode
。就像UUID。将activity_kode
更改为UUID比实现信号量更容易。信号量的概念就像带锁的门。如果门是锁着的,请勿进入,有人进入。放一些布尔型变量作为门,在生成activity_kode
之前先检查门是否先锁住。
有很多实现它的方法,因为这是node.js问题,所以可以通过实现信号量的方式使用回调或异步等待。有人使用数据库中的标志字段,有人仅使用变量,有人使用空文件,有人使用纯文本文件,只包含1或0。
希望对您有帮助。