Реактивные кварки Postgresql транзакции - PullRequest
1 голос
/ 02 мая 2020

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

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

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 Ответ

1 голос
/ 02 мая 2020

Вы можете использовать родительский этап с 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());
        });
...