#node.js #concurrency #queue #hana #database-deadlocks
Вопрос:
Всем привет, я разрабатываю скрипт nodejs для управления заданиями. У меня есть функция, которая запускает следующую транзакцию:
const globalTask = () => {
await startTransaction();
const job = await sql(`SELECT * FROM "jobs" WHERE "state"='WAITING' LIMIT 1 FOR UPDATE
IGNORE LOCKED`);
if (job) {
await sql(`UPDATE "jobs" SET "state"='PENDING' WHERE "id"=${job[0].id}`);
}
await this.commit();
if (!job) return;
// other phases...
// here the job is processed....
};
Тогда у меня есть «основная» функция, которая с обещанием.все запускает 10 раз функцию globalTask ().
К сожалению, иногда я получаю исключение с сообщением «транзакция откатана из-за обнаруженной тупиковой ситуации: сбой обновления TrexColumnUpdate в таблице» задания «или я замечаю, что одна или несколько строк были выбраны несколько раз.
Как я должен изменить команду sql?
База данных, которую я использую, — это SAP HANA.
const main = async () => {
const results = await Promise.all([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(_ => globalTask()));
// business logic
};
Комментарии:
1. Тупики,основанные на параллелизме, — это немного больше теория, чем реальный ответ, так как это зависит от того, что вы хотите сделать. Например, вы могли бы обнаружить ошибку взаимоблокировки, а затем решить снова попытаться прочитать из таблицы с
NOT IN
помощью предложения в вашем SQL, увеличивающего количество раз x, пока у вас не появится идентификатор задания для чтения/записи.2. Эта проблема требует более подробной информации, т. Е. информации о трассировке взаимоблокировки, чтобы понять, какие транзакции каким образом были задействованы. Я рекомендую открыть инцидент в службе поддержки, чтобы проанализировать его.