node.js - node-postgres 库:如何通过事件驱动的数据库插入来避免竞争条件?
问题描述
我目前正面临数据库插入的竞争条件问题。
我尝试简化我的原始代码以尝试解释问题。(我希望我没有在重写过程中带来错误)
** 主程序 **
var pool = new pg.Pool({
database: 'DB',
user: 'User',
password: 'Password'
});
conn.on('someEvent', async function(e) {
var param1 = e.getHeader('param1');
var param2 = e.getHeader('param2');
var myObj = new MYOBJ(null);
var params:{
param1:param1,
param2:param2
}
await myObj.InsertInPQ(pool,params);
})
** 我为访问数据库而创建的自定义对象 **
myObj.prototype.insertInPQ = async function(pool,params) {
var myObj=this;
try {
console.log("ENTERING myObj.insertInDB() with param1:"+params.param1+" and param2:"+params.param2);
var query= "INSERT INTO schema.SOMETABLE "+
"VALUES ($1,$2)"
const { rows } = await pool.query(query,[params.param1,params.param2]);
return (true);
}
catch(err){
throw new Error("myObj.insertInDB() for param1:"+params.param1+" and params2:"+params.param2+" error:"+err)
}
};
现在假设 eventA 和 eventB 几乎同时发生:
事件A:参数1=1,参数2=2 事件B:参数1=3 参数2=4
在事件 A 上:
控制台将显示: ENTERING myObj.insertInDB() with param1=1 and param2=2 DB inserttion 就可以了。
在 eventB 上:控制台将显示:ENTERING myObj.insertInDB() with param1=3 and param2=4
但是 postgres 日志将报告插入带有 eventA 值 (1,2) 的行。
我不明白 nodejs 和 pg 库是如何在后台运行的,以及我应该做些什么来避免这种问题(顺便说一下,这些问题是非永久性的,所以很难解决)。
有人有建议吗?
问候,
雅杜康