如何使用 Reactor 和 Spring 创建 PostgreSQL savePoint

问题描述

io.r2dbc.spi.ConnectionPostgresqlConnectioncreateSavepointreleaseSavepointrollbackTransactionToSavepoint 方法。 如何通过 R2dbcTransactionManagerTransactionalOperator 使用这些方法

我想创建一个尝试插入到表中的幂等服务,如果违反了唯一约束,则选择现有记录并继续

Mono.just(newOrder)
    .flatMap(order -> orderRepository.save(order)
        .onErrorResume(throwable -> orderRepository.findByUniqueField(newOrder.uniqueField))

    .otherProcesses...
    .as(transactionalOperator::transactional)

我收到来自 Postgresqlcurrent transaction is aborted,commands ignored until end of transaction block

我看到了这个答案 https://stackoverflow.com/a/48771320/5275087 但它接缝 autosave=always 不适用于 r2dbc

我想尝试类似的东西:

transactionalOperator.execute(reactiveTransaction -> {
  GenericReactiveTransaction genericReactiveTransaction = (GenericReactiveTransaction) reactiveTransaction;
  ConnectionFactoryTransactionObject txObject = (ConnectionFactoryTransactionObject) genericReactiveTransaction.getTransaction();
  Connection connection = txObject.getConnectionHolder().getConnection();
  return Mono.from(connection.createSavepoint(TRANSACTION_LEVEL_1))
            .then(Mono.just(newOrder)
                .flatMap(order -> orderRepository.save(order)
                    .onErrorResume(throwable ->
                        Mono.from(connection.rollbackTransactionToSavepoint(TRANSACTION_LEVEL_1))
                            .then(orderRepository.findByUniqueField(newOrder.uniqueField)))
                ));

但是 R2dbcTransactionManager.ConnectionFactoryTransactionObject一个私有类。

如何在不使用反射的情况下实现这一点

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)