Вот рабочий пример Java:
@Autowired TransactionalDatabaseClient txClient;
@Autowired Mono<Connection> connection;
//You Can also use: @Autowired Mono<? extends Publisher> connectionPublisher;
public Flux<Void> example {
txClient.enableTransactionSynchronization(connection);
// Or, txClient.enableTransactionSynchronization(connectionPublisher);
Flux<AuditConfigByClub> audits = txClient.inTransaction(tx -> {
txClient.beginTransaction();
return tx.execute().sql("SELECT * FROM audit.items")
.as(Item.class)
.fetch()
.all();
}).doOnTerminate(() -> {
txClient.commitTransaction();
});
txClient.commitTransaction();
audits.subscribe(item -> System.out.println("anItem: " + item));
return Flux.empty()
}
Я только начал реагировать, поэтому не слишком уверен, что я делаю с моими обратными вызовами, ха-ха.Но я решил пойти с TransactionalDatabaseClient
над DatabaseClient
или Connection
, так как я возьму все утилиты, которые смогу получить, пока R2dbc находится в текущем состоянии.
В своем коде вы действительно создали экземплярОбъект подключения?Если это так, я думаю, вы бы сделали это в вашей конфигурации.Его можно использовать во всем приложении так же, как и DatabaseClient, но он немного сложнее.
Если нет:
@Bean
@Override // I also used abstract config
public ConnectionFactory connectionFactory() {
...
}
@Bean
TransactionalDatabaseClient txClient() {
...
}
//TransactionalDatabaseClient will take either of these as arg in
//#enableTransactionSynchronization method
@Bean
public Publisher<? extends Connection> connectionPublisher() {
return connectionFactory().create();
}
@Bean
public Mono<Connection> connection() {
return = Mono.from(connectionFactory().create());
}
Если у вас возникли проблемы с переводом на Kotlin, есть альтернативаспособ включить синхронизацию, которая может работать:
// From what I understand, this is a useful way to move between
// transactions within a single subscription
TransactionResources resources = TransactionResources.create();
resources.registerResource(Resource.class, resource);
ConnectionFactoryUtils
.currentReactiveTransactionSynchronization()
.subscribe(currentTx -> sync.registerTransaction(Tx));
Надеюсь, это хорошо для Котлина.