Как контролировать поток транзакционного потока с Spring Data R2DBC? - PullRequest
0 голосов
/ 24 июня 2019

Поддержка транзакционных потоков, по-видимому, была недавно реализована , но из-за ее новизны примеров кода не так много.

Может ли кто-нибудь показать пример транзакционного потока, который выполняетряд вставок базы данных, а затем возвращает какое-то значение в случае успеха, но с промежуточной контрольной точкой между вставками, которая проверяет некоторое условие и может откатить транзакцию и вернуть разные значения в зависимости от результата контрольной точки?

1 Ответ

0 голосов
/ 24 июня 2019

Реактивные транзакции следуют тому же шаблону, что и императивные:

  1. Транзакция запускается перед выполнением любых команд пользовательского пространства
  2. Запуск команд пользовательского пространства
  3. Фиксация (или откат)

Здесь следует отметить несколько аспектов: Соединение всегда связано с материализацией реактивной последовательности.То, что мы знаем из 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();

Здесь можно выделить следующие важные моменты:

  1. Мы используем TransactionalOperator вместо@Transactional.
  2. Код в .handle() вызывает setRollbackOnly() для отката транзакции.

Используя @Transactional, вы обычно используете исключения, чтобы сигнализировать об условии отката.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...