【问题标题】:Transactions using r2dbc-postgresql使用 r2dbc-postgresql 的事务
【发布时间】:2020-12-26 13:58:12
【问题描述】:

我正在尝试生成在一个事务中同时执行 2 个 postgresql 命令的代码。 我的 DB 2 规则中有不同的规则顺序,我想在它们之间切换规则顺序。 我正在使用 r2dbc-postgresql (v0.8.4) 和 spring-data-r2dbc (v1.1.1)。

我已经定义了 DatabaseClient 和 TransactionalOperator 并尝试使用那段代码:

public Mono<Void> insertRows() {
    return databaseClient.execute("update rules set rule_order = 2 where rule_order = 1")
            .fetch().rowsUpdated()
            .then(databaseClient.execute("update rules set rule_order = 1 where rule_order = 2")
                .fetch().rowsUpdated())
            .then()
            .as(transactionalOperator::transactional);
}

但结果是命令一个接一个地运行,所以我完成了规则顺序 = 1 的两个规则。

我做错了什么,我该如何解决?

【问题讨论】:

    标签: postgresql spring-boot spring-transactions spring-data-r2dbc r2dbc


    【解决方案1】:

    不确定您在这里期待什么。

    第一条语句将规则行更新为rule_order=2(update rules set rule_order = 2 where rule_order = 1)。第二个更新规则为rule_order=1 (update rules set rule_order = 1 where rule_order = 2)。

    【讨论】:

    • 有没有办法同时运行命令来执行这个切换?
    • 没有。在单个事务中操作时,所有数据库(至少据我所知)都需要顺序执行命令。
    • 我可以使用代码执行此命令吗?更新规则 SET rule_order = CASE rule_order WHEN 1 THEN 2 WHEN 2 THEN 1 END WHERE rule_order IN (1, 2);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2019-11-06
    • 2020-08-24
    • 2021-03-10
    • 2012-01-04
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多