gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:47:35 24 4
gpt4 key购买 nike

对事务流的支持似乎是 recently implemented但由于其新颖性,代码示例并不多。

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

最佳答案

响应式(Reactive)事务遵循与命令式事务相同的模式:

  • 在运行任何用户空间命令之前启动事务
  • 运行用户空间命令
  • 提交(或回滚)

  • 这里需要注意的几个方面: 连接总是与 react 序列的具体化相关联。我们从 Thread 得知的信息绑定(bind)到命令式编程中的执行的绑定(bind)连接转换为响应式(Reactive)编程中的物化。

    因此,每个(并发)执行都会分配一个连接。

    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 ,您通常会使用异常来表示回滚条件。

    关于r2dbc - 如何使用 Spring Data R2DBC 控制事务流的流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56741246/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com