C# Redis使用';排队';
运行了一段时间后,我的应用程序Redis没有回答查询,只说排队。 当我执行代码中的所有事务时,事务似乎是打开的。 为什么交易没有完成?有没有办法检测并回滚它 我已经查看了事务对象,没有丢弃、回滚或类似的内容 问题开始时我有这个日志C# Redis使用';排队';,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,运行了一段时间后,我的应用程序Redis没有回答查询,只说排队。 当我执行代码中的所有事务时,事务似乎是打开的。 为什么交易没有完成?有没有办法检测并回滚它 我已经查看了事务对象,没有丢弃、回滚或类似的内容 问题开始时我有这个日志 StackExchange.Redis.RedisConnectionException: An unknown error occurred when writing the message at StackExchange.Redis.Conn
StackExchange.Redis.RedisConnectionException: An unknown error occurred when
writing the message
at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message
message, ResultProcessor`1 processor, ServerEndPoint server)
at StackExchange.Redis.RedisTransaction.Execute(CommandFlags flags)
当Redis继续回答“排队”时,监视器命令刚刚记录了PING。您的事务似乎没有正确结束。例如,在同一个redis连接中,不会对begin命令执行命令 以下是一个例子:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set x 123
QUEUED
127.0.0.1:6379> set y 456
QUEUED
127.0.0.1:6379> set z 678
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
无论您在命令MULTY
之后输入了多少,在执行EXEC
命令之前,它将始终显示队列。如果需要,请仔细检查代码
交易开始后有什么遗漏吗
或者您正在使用相同的共享redis连接对象来存储值
更新:来自评论:
在redis中无法回滚,但通过以下方式放弃此事务:
> SET foo 1
OK
> MULTI
OK
> INCR foo
QUEUED
> DISCARD
OK
但我真正想要的是,有没有办法检测并回滚它
是的,可以检测错误。但redis本机不支持回滚。从redis文档:
如果您有关系数据库背景,那么在事务期间Redis命令可能会失败,但Redis仍将执行事务的其余部分,而不是回滚,这一事实可能会让您感到奇怪
然而,对于这种行为有一些好的看法:
只有使用错误的语法调用Redis命令(并且在命令队列中无法检测到问题)或针对持有错误数据类型的键调用Redis命令时,Redis命令才会失败:这意味着在实际情况下,失败的命令是编程错误的结果,并且是在开发过程中很可能检测到的错误,而不是在生产中。
Redis在内部简化且速度更快,因为它不需要回滚功能。
反对Redis观点的一个论点是错误会发生,但是应该注意的是,一般来说,回滚并不能避免编程错误。例如,如果查询将一个键增加2而不是1,或者增加了错误的键,则回滚机制无法提供帮助。考虑到没有人能够将程序员从错误中解救出来,并且Redis命令失败所需的错误不太可能进入生产环境,我们选择了更简单、更快的方法,即不支持错误回滚
谢谢鲁胡尔的回答。但我真正想要的是,有没有办法检测并回滚它?在我的例子中,发生了一个未知的异常,但是如何回滚它?或者干脆我应该再次尝试执行它?