gpt4 book ai didi

java - Redis中如何实现带回滚的事务

转载 作者:IT王子 更新时间:2023-10-29 06:11:11 26 4
gpt4 key购买 nike

我的程序需要将数据作为事务添加到 Redis 中的两个列表中。两个列表中的数据应该一致。如果出现异常或系统故障,程序只将数据添加到一个列表中,系统应该能够恢复和回滚。但是基于Redis doc,它不支持回滚。我该如何实现?我使用的语言是 Java。

最佳答案

如果你需要事务回滚,我建议使用 Redis 以外的东西。 Redis 事务与其他数据存储不同。即使是 Multi/Exec 也不能满足您的需求——首先是因为没有回滚。如果你想要回滚,你将不得不下拉两个列表以便你可以恢复 - 并希望在我们的错误条件和“回滚”之间没有其他客户端也修改任何一个列表。以理智和可靠的方式做到这一点并不微不足道,也不简单。对于 SO 来说,这也可能不是一个好问题,因为它非常广泛,而不是特定于 Redis。

现在来谈谈为什么 EXEC 没有按照人们的想法行事。在您提出的场景中,MULTI/EXEC 处理以下情况:

  1. 您设置 WATCHes 以确保没有发生其他更改
  2. 您的客户在发出 EXEC 之前死亡
  3. Redis 内存不足

发出 EXEC 命令完全有可能出错。当您发出 EXEC 时,Redis 将执行队列中的所有 命令并返回错误列表。它不会提供 add-to-list-1 工作和 add-to-list-2 失败的情况。您的两个列表仍然会不同步。当你发出时,在发出 MULTI 之后说一个 LPUSH,你总是会得到一个 OK 除非你:

  • a) 之前添加了一个 watch 并且该列表中的某些内容发生了变化或
  • b) Redis 返回 OOM 条件以响应排队的推送命令

DISCARD 并不像某些人想象的那样起作用。 DISCARD 用于而不是 EXEC,不作为回滚机制。一旦您发出 EXEC,您的交易就完成了。 Redis 根本没有任何回滚机制——这不是 Redis 事务的目的。

理解 Redis 所谓的事务的关键是要认识到它们本质上是客户端连接级别的命令队列。它们不是数据库状态机。

关于java - Redis中如何实现带回滚的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39585903/

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