Реактивные транзакции 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());
});