首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring反应性中使用事务?

如何在Spring反应性中使用事务?
EN

Stack Overflow用户
提问于 2019-06-18 11:21:22
回答 1查看 3.1K关注 0票数 3

例如,我试图使用SpringDataRedis2.1.8中的ReactiveRedisOperations进行事务处理:

代码语言:javascript
复制
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

但是,在浏览文档ReactiveRedisOperations时,我似乎找不到这样的方法。这是否在反应性客户端中不可用,或者如何实现?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-18 11:37:09

TL;DR:使用反应性API对Redis事务没有适当的支持

原因在于执行模型: Redis是如何执行事务的,以及反应性API应该如何工作。

当使用事务时,连接进入事务状态,然后命令排队,最后使用EXEC执行。使用exec执行排队命令使单个命令的执行取决于EXEC命令。

考虑以下片段(生菜代码):

代码语言:javascript
复制
RedisReactiveCommands<String, String> commands = …;

commands.multi().then(commands.set("key", "value")).then(commands.exec());

这个序列以某种线性的方式显示命令调用:

  • 发行MULTI
  • 一旦MULTI完成,发出一个SET命令
  • 一旦SET完成,调用EXEC

警告与SETSET只在调用EXEC之后才完成。这意味着我们有一个对exec命令的前向引用。我们不能听将来将要执行的命令。

您可以应用一种解决方法:

代码语言:javascript
复制
RedisReactiveCommands<String, String> commands = …

Mono<TransactionResult> tx = commands.multi()
        .flatMap(ignore -> {

            commands.set("key", "value").doOnNext(…).subscribe();

            return commands.exec();
        });

解决方法将在代码中包含命令订阅(注意:这是反应性编程中的反模式)。调用exec()之后,您将得到TransactionResult作为回报。

还请注意:虽然您可以通过Mono<TransactionResult>检索结果,但实际的SET命令也会发出其结果(参见doOnNext(…))。

尽管如此,它允许我们回过头来讨论实际问题:因为这些概念不能很好地结合在一起,所以在Spring中没有用于事务性使用的API。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56647972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档