Лучшие практики MongoDB Panache для транзакций с несколькими документами - PullRequest
1 голос
/ 17 июня 2020

Что касается приведенной ниже цитаты в документации 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 Ответ

2 голосов
/ 17 июня 2020

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

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

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

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

...