Как я могу вставить и получить последний вставленный идентификатор в mysql с транзакциями, используя клиент quarkus reactive mysql с mutiny api - PullRequest
1 голос
/ 16 июня 2020

Как бы я go мог создать транзакцию, вставить строку, зафиксировать транзакцию и получить последний вставленный идентификатор. Таким образом, метод должен вернуть Uni<Integer>. Я новичок в api mutiny, я ранее использовал механизм цепочки будущих обработчиков vertx.io, поэтому немного сложно перенастроить себя для работы с api mutiny. Я проверил документацию и думаю, что что-то похожее на следующий фрагмент должно работать, но я в тупике, как заставить его работать и возвращать 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())
   );

1 Ответ

2 голосов
/ 16 июня 2020

Попробуйте следующее:

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

A 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))
);
...