recently implemented对事务流的支持似乎已经,但由于它的新颖性,因此没有太多的代码示例。
有人可以显示一个事务流的示例,该事务流执行一系列数据库插入,然后在成功时返回一些值,但是插入之间的中间流检查点可以测试某些条件,并可能回滚事务并根据返回不同的值检查点结果?
答案 0 :(得分:0)
反应性交易遵循与强制性交易相同的模式:
这里需要注意的几个方面:连接始终与反应性序列的实现相关联。我们从绑定到命令式编程中的执行的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
来使用异常来表示回滚情况。