1

我将如何创建事务、插入行、提交事务并获取最后插入的 id。所以该方法应该返回一个Uni<Integer>. 我是 mutiny api 的新手,我之前使用过vertx.io链接未来处理程序机制,因此重新调整自己以使用 mutiny api 有点困难。我检查了文档并认为类似于以下代码段的内容应该可以工作,但我很难理解如何使它工作并Uni<Integer>从最后一个查询而不是Uni<Void>tx.commit()

return this.client.begin()
   .flatMap(tx -> tx
           .preparedQuery("INSERT INTO person (firstname,lastname) VALUES ($1,$2)")
           .execute(Tuple.of(person.getFirstName(),person.getLastName()))
           .onItem().produceUni(id-> tx.query("SELECT LAST_INSERT_ID()"))
           .onItem().produceUni(res -> tx.commit())
           .onFailure().recoverWithUni(ex-> tx.rollback())
   );
4

1 回答 1

2

试试这个:

return client.begin().onItem().produceUni(tx -> tx
    .preparedQuery("INSERT INTO person (firstname,lastname) VALUES ($1,$2)").execute(Tuple.of(person.getFirstName(),person.getLastName()))
    .onItem().produceUni(id -> tx.query("SELECT LAST_INSERT_ID()").execute())
    .onItem().apply(rows -> rows.iterator().next().getInteger(0))
    .onItem().produceUni(item -> tx.commit().on().item().produceUni(v -> Uni.createFrom().item(item)))
    .on().failure().recoverWithUni(throwable -> {
        return tx.rollback().on().failure().recoverWithItem((Void) null)
            .on().item().produceUni(v -> Uni.createFrom().failure(throwable));
    })
);

SqlClientHelper将在未来版本中加入 Quarkus(希望如此1.6)。您将能够简化为:

return SqlClientHelper.inTransactionUni(client, tx -> tx
    .preparedQuery("INSERT INTO person (firstname,lastname) VALUES ($1,$2)").execute(Tuple.of(person.getFirstName(),person.getLastName()))
    .onItem().produceUni(id -> tx.query("SELECT LAST_INSERT_ID()").execute())
    .onItem().apply(rows -> rows.iterator().next().getInteger(0))
);
于 2020-06-16T15:06:30.683 回答