Веб-крючок может срабатывать дважды за очень небольшое время каждый раз, когда товар обновляется в моем магазине Shopify.
Когда этот webhook запущен, он вызывает лямбду, которая выполняет задачу над строкой в базе данных, однако я обнаружил, что просто помечая каждую строку столбцом с надписью task_complete: true
, а затем условно проверяя этот db.result.task_complete === false
недостаточно параллелизма. Я получаю двойное задание и другие побочные эффекты.
Я понимаю, что именно здесь приходят транзакции. Я делаю следующее:
return await db.connection.transaction({ isolationLevel: db.Sequelize.Transaction.ISOLATION_LEVELS.SERIALIZABLE }, async (t) => {
return db.orders.findOrCreate({
where: {
shopify_order_id: order.id.toString()
},
limit: 1,
transaction: t,
lock: true,
skipLocked: true
})
.then(async...
Я вижу в своем терминале, что БД действительно запрашивается как:
SELECT ... LIMIT 1 FOR UPDATE SKIP LOCKED;
Так почему я получаю по два outputs
за один запуск лямбда-задачи? Документация на сайте Sequelize не дает необходимой мне ясности.