Лучшие практики MongoDB Panache для транзакций с несколькими документами

Что касается приведенной ниже цитаты в документации MongoDB Panache [https://quarkus.io/guides/mongodb-panache]

MongoDB предлагает транзакции ACID, начиная с версии 4.0. MongoDB с Panache не поддерживает их.

Таким образом, существует ли рекомендуемый подход или передовая практика обработки многодокументных транзакций для обеспечения атомарности?

Рассмотрим пример:

public void buyCarTest() {   
    carRepository.increaseStock(1); 
    cashRepository.decreaseCash(10000);
}

Если бы мы сделали это вручную, это было бы:

  1. проверьте, не удалась ли операция записи во 2-й репозиторий, и
  2. если да, отменить изменения, внесенные в carRepository

Этот подход кажется в лучшем случае неубедительным, особенно если я пишу более двух репозиториев.

Спасибо.

1 ответ

Решение

То, что вы предлагаете, называется компенсацией, и ее сложно реализовать.

Я бы предпочел использовать для этого механизм, основанный на событиях: вы отправляете два события, и они обрабатываются асинхронно, поэтому отказ одного из арендаторов (управляющего запасами) не повлияет на второй.

Вы также можете использовать транзакцию MongoDB, но для этого вам нужно будет использовать API MongoDB вместо Panache (поэтому получите коллекцию из своей сущности и используйте ее).

Поддержка транзакций для MongoDB находится в стадии разработки (см. https://github.com/quarkusio/quarkus/pull/7222), вы можете посмотреть эту проблему, чтобы получить уведомление, когда она будет реализована.

Другие вопросы по тегам