问题描述
io.r2dbc.spi.Connection 和 PostgresqlConnection 有 createSavepoint
、releaseSavepoint
和 rollbackTransactionToSavepoint
方法。
如何通过 R2dbcTransactionManager
和 TransactionalOperator
使用这些方法?
我想创建一个尝试插入到表中的幂等服务,如果违反了唯一约束,则选择现有记录并继续
Mono.just(newOrder)
.flatMap(order -> orderRepository.save(order)
.onErrorResume(throwable -> orderRepository.findByUniqueField(newOrder.uniqueField))
.otherProcesses...
.as(transactionalOperator::transactional)
我收到来自 Postgresql 的 current 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 (将#修改为@)