Как обеспечить возможность одновременного вызова эндпойнта, пишущего в БД?

Доброго дня.

Есть простой сервер на Express, БД postgres через sequelize. Если я делаю простой запрос через постман, то все отлично работает, но при тестировании нагрузок с 10 потоками одновременно наступает дедлок. Я попробовал сделать через транзакцию (1 запрос - 1 транзакция), но это не работает, в консоли просто выводится, что транзакция стартанула 10 раз, и потом эксепшен по таймауту.

Я знаю только одно решение - поднять redis и через менеджер очередей добавлять туда задание на обновление БД. А клиента заставлять ждать, пока не выполнится задание в очереди.

Но может, есть вариант проще \ лучше? Например, на уровне Постгреса или Sequelize.

Заранее спасибо.
  • Вопрос задан
  • 148 просмотров
Решения вопроса 2
AlexMcArrow
@AlexMcArrow
Люблю РНР, да я такой!
Решение нужно искать не в последовательном исполнении, а понять что вы делаете с БД что два идентичных обращения вызывают дедлок.
Например: если вы делаете апдейт одной и той же строки - то вопрос а может ли прийти 10 таких запросов на одну строку?
Ответ написан
@holllop
Попытаюсь ответить как-то комплексно.
Дедлоки в базе данных могут быть вызваны различными причинами, такими как конфликты параллельных транзакций, блокировки на ресурсы и другие. В вашем случае, если у вас возникают дедлоки при одновременных запросах, использование транзакций может помочь, но вам также необходимо управлять блокировками и избегать конфликтов. То есть воспользоваться блокировкой на уровне строки (Row Locking) и блокировкой на уровне транзакции (Transaction Locking) это всё механизмы Sequelize. Вполне возможно, что даже при использовании этих механизмов могут остаться дедлоки. И в таком случае использование Redis будет необходимо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы