Реактивные транзакции Quarks Postgresql

Я просмотрел руководство по работе с реактивными SQL-клиентами ( https://quarkus.io/guides/reactive-sql-clients), но не могу понять, как можно работать с транзакциями. Допустим, я бы хотел улучшить это демонстрационное фруктовое приложение с помощью транзакций.

Как я могу использовать следующий метод для использования транзакции, которая также отменяет все внесенные изменения, если что-то в транзакции не удалось?

public static Multi<Fruit> findAll(PgPool client) {
        return client.query("SELECT id, name FROM fruits ORDER BY name ASC")
                .onItem().produceMulti(set -> Multi.createFrom().items(() -> StreamSupport.stream(set.spliterator(), false)))
                .onItem().apply(Fruit::from);
    }

1 ответ

Вы можете использовать родительский этап сthen() или onItem().produceMulti()чтобы предоставить всем вашим подэтапам доступ к элементу родительского этапа (в данном случае транзакции). Это позволит последующим подэтапам получить прямой доступ к объекту транзакции для закрытия / отката.

Например:

return pgPool.begin()
    .onItem().produceMulti(tx -> {
        return tx.query("DELETE FROM fruits").execute()
                 .onItem().invoke(delete -> tx.query("SELECT id, name FROM fruits ORDER BY name ASC").execute())
                 .onItem().produceMulti(set -> Multi.createFrom().items(() -> StreamSupport.stream(set.spliterator(), false)))
                 .onItem().apply(Fruit::from)
                 .onFailure().invoke(ex -> tx.rollback())
                 .on().termination(() -> tx.close());
        });
Другие вопросы по тегам