如何使用弹簧数据R2DBC控制交易流的流动



对交易流的支持似乎是最近实施的,但由于其新颖性,没有很多代码示例。

有人可以显示一个交易流的示例,该流程流执行一系列数据库插入,然后在成功中返回一些价值,但是在插入之间有一个中游检查点,该检查点可以测试某些条件并可能会退回交易并根据不同的值返回不同的值在检查点结果?

反应性交易遵循与命令的模式相同的模式:

  1. 在运行任何用户空间命令
  2. 之前开始进行交易
  3. 运行用户空间命令
  4. 提交(或回滚(

在这里要注意的几个方面:连接始终与反应序列的物质化相关联。我们从 Thread -bound连接中所知道的,该连接绑定到命令式编程中的执行,这转化为反应性编程中的物质化。

因此,每个(并发(执行获得一个连接。

弹簧数据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,您通常会使用异常来发出回滚条件。

最新更新