Как контролировать поток транзакционного потока с Spring Data R2DBC?
Поддержка транзакционных потоков, похоже, была недавно реализована, но из-за ее новизны примеров кода не так много.
Может ли кто-нибудь показать пример транзакционного потока, который выполняет серию вставок в базу данных, а затем возвращает определенное значение в случае успеха, но с промежуточной контрольной точкой между вставками, которая проверяет некоторое условие и может откатить транзакцию и вернуть разные значения в зависимости от контрольной точки результат?
1 ответ
Реактивные транзакции следуют той же схеме, что и императивные:
- Транзакция запускается перед выполнением любых команд пользовательского пространства
- Запустите команды пространства пользователя
- Фиксация (или откат)
Здесь следует отметить несколько аспектов: Соединение всегда связано с материализацией реактивной последовательности. Что мы знаем из Thread
связанное соединение, которое связано с выполнением в императивном программировании, означает материализацию в реактивном программировании.
Таким образом, каждое (одновременное) выполнение получает назначенное соединение.
Spring Data R2DBC не поддерживает точки сохранения. Взгляните на следующий пример кода, который иллюстрирует решение о коммите или откате:
DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);
TransactionalOperator transactionalOperator = TransactionalOperator
.create(new R2dbcTransactionManager(connectionFactory));
transactionalOperator.execute(tx -> {
Mono<Void> insert = databaseClient.execute("INSERT INTO legoset VALUES(…)")
.then();
Mono<Long> select = databaseClient.execute("SELECT COUNT(*) FROM legoset")
.as(Long.class)
.fetch()
.first();
return insert.then(select.handle((count, sink) -> {
if(count > 10) {
tx.setRollbackOnly();
}
}));
}).as(StepVerifier::create).verifyComplete();
Примечательные аспекты здесь:
- Мы используем
TransactionalOperator
вместо@Transactional
, - Код в
.handle()
звонкиsetRollbackOnly()
откатить транзакцию.
С помощью @Transactional
обычно вы используете исключения для сигнализации об условиях отката.