Как я могу вставить и получить последний вставленный идентификатор в mysql с транзакциями, используя реактивный клиент mysql quarkus с api mutiny
Как мне создать транзакцию, вставить строку, зафиксировать транзакцию и получить последний вставленный идентификатор. Таким образом, метод должен вернутьUni<Integer>
. Я новичок в api мятежа, раньше я использовал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 ответ
Решение
Попробуй это:
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))
);