如何使用Spring Data R2DBC控制事务流的流?

时间:2019-06-24 17:19:08

标签: r2dbc spring-data-r2dbc

recently implemented对事务流的支持似乎已经enter image description here,但由于它的新颖性,因此没有太多的代码示例。

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

1 个答案:

答案 0 :(得分:0)

反应性交易遵循与强制性交易相同的模式:

  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来使用异常来表示回滚情况。