Sequelize Race Condition с Nodejs (Транзакции, LOCK) - PullRequest
0 голосов
/ 21 июня 2019

Веб-крючок может срабатывать дважды за очень небольшое время каждый раз, когда товар обновляется в моем магазине 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 не дает необходимой мне ясности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...