过了一段时间,我的应用程序Redis没有回答查询,只说排队。当我在代码中执行所有事务时,事务似乎是打开的。为什么交易没有完成?是否有检测和回滚的方法?
我看了一下事务对象,没有丢弃、回滚或类似的东西。
问题开始的时候我有这个日志。
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。
发布于 2019-07-31 13:48:57
你的交易似乎没有正确结束。例如,对于同一redis连接中的begin命令MULTY,不执行MULTY命令。
下面是一个示例:
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支持的。从红宝石的文档:
Why Redis does not support roll backs? 如果您有关系数据库背景,那么Redis命令在事务期间可能会失败,但是Redis将执行事务的其余部分而不是回滚,这在您看来可能很奇怪。 然而,对于这种行为有很好的看法: 只有在使用错误的语法调用(在命令排队期间无法检测到问题)或针对包含错误数据类型的键时,Redis命令才能失败:这意味着,在实际情况下,失败的命令是编程错误的结果,并且是在开发过程中非常可能检测到的错误,而不是在生产中检测到的错误。Redis是内部简化和更快,因为它不需要回滚的能力。一个反对Redis观点的观点是,错误会发生,但是应该注意的是,通常回滚并不能使您免于编程错误。例如,如果查询将密钥增量为2而不是1,或者增加了错误的键,则回滚机制无法提供帮助。考虑到没有人能够避免程序员的错误,并且Redis命令失败所需的错误类型不太可能进入生产阶段,我们选择了一种更简单、更快的方法,不支持错误回滚。
https://stackoverflow.com/questions/57286118
复制相似问题