首页 > 解决方案 > 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 库是如何在后台运行的,以及我应该做些什么来避免这种问题(顺便说一下,这些问题是非永久性的,所以很难解决)。

有人有建议吗?

问候,

雅杜康

标签: node.jspostgresqlnode-postgres

解决方案


推荐阅读