首页 > 解决方案 > Quarks 反应式 Postgresql 事务

问题描述

我查看了使用响应式 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);
    }

标签: transactionsquarkusreactive-postgresql-client

解决方案


您可以将父阶段then()onItem().produceMulti()授予所有子阶段访问父阶段项(在本例中为事务)的权限。这将允许后面的子阶段直接访问 Transaction 对象以进行关闭/回滚。

例如:

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());
        });

推荐阅读