#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 не будет затронуто, здесь нет условий гонки. И нет, вам не нужны транзакции для вставки одной инструкции.