библиотека node-postgres : Как избежать состояния гонки при вставке базы данных, управляемой событиями?

#node.js #postgresql #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)
    }
};
 

Давайте теперь предположим, что события A и B происходят почти одновременно с :

Событие: парам1=1, парам2=2 Событие Б: парам1=3 парам2=4

На эвентА :

консоль отобразит : ВВОД myObj.insertInDB() с параметром 1=1 и параметром 2=2 для вставки будет в порядке.

На EventB : консоль отобразит : ВВОД myObj.insertInDB() с параметрами 1=3 и 2=4

Но журналы postgres сообщат о вставке строки со значениями EventA (1,2).

Я не понимаю, как nodejs и библиотека pg работают под капотом, и что я должен делать, чтобы избежать такого рода проблем (которые, кстати, непостоянны, поэтому их очень трудно устранить).

У кого-нибудь есть предложение ?

С уважением,

Ядукам

Комментарии:

1. В чем именно заключается проблема? Вы хотите сказать, что EventB потерян? Какие журналы postgres вы просматриваете?

2. пожалуйста, проверьте ссылку на некоторые примеры здесь, я сам в настоящее время изучаю состояние гонки

3. » журналы postgres сообщат о вставке строки со значениями EventA (1,2) » — этого не произойдет, если вы либо не запустите EventA дважды, либо у вас уже были эти значения в SOMETABLE . В любом случае, событие B не будет затронуто, здесь нет условий гонки. И нет, вам не нужны транзакции для вставки одной инструкции.