如何解决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
在 eventA 上:
控制台将显示: ENTERING myObj.insertInDB() with param1=1 and param2=2 数据库插入就可以了。
在事件B上: 控制台将显示: ENTERING myObj.insertInDB() with param1=3 and param2=4
但是 postgres 日志会报告插入一个带有 eventA 值 (1,2) 的行。
我不明白 nodejs 和 pg 库是如何在后台运行的,我应该怎么做才能避免此类问题(顺便说一下,这些问题是非永久性的,因此很难排除故障)。
有人有什么建议吗?
问候,
亚都康
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。