我对Redis还不熟悉,在阅读官方网站上的事务处理时,有一点让我很困惑。
1. 它说:
所有命令都会被处理,或者全部不处理,因此Redis事务也是原子操作。
2. 然后又说:
即使一个命令失败了,队列中的所有其他命令也会被处理 -
这两者不是相互矛盾吗?
1. 它说:
所有命令都会被处理,或者全部不处理,因此Redis事务也是原子操作。
2. 然后又说:
即使一个命令失败了,队列中的所有其他命令也会被处理 -
这两者不是相互矛盾吗?
EXEC
命令之后排队的任何管道化命令都将被执行。处理过的命令和失败之间有所不同。在SQL中,如果任何一个命令失败,整个事务将被回滚,就好像没有任何命令被执行一样。在redis中,命令的失败并不会阻止其他命令的处理或已经处理的命令,每个命令都可以独立地成功或失败。
因此,如果您增加了一个计数器,然后尝试将另一个键设置为值并且失败了,增量仍然发生,并且不会被回滚。因此,即使其中一个命令失败,所有命令也都被处理了。
multi
系列命令实现的 Redis 事务并不是一个好选择,因为它是一种过时的功能(作者认为 Lua 是一种更好的方式,使 multi
完全不必要)。使用 Redis Lua 更好!如果需要更多信息,请回复。
我认为Redis事务的“原子性”定义有点像“线性化”。
参考https://en.wikipedia.org/wiki/Linearizability
这种瞬间发生或不可分割的属性,导致使用“原子性”作为“线性化”的替代术语。
在这种情况下,Redis确保事务的执行不会被其他命令干扰(或不可分割),并且事务中的命令可以按顺序逐个执行。
关于Redis允许部分成功的原因,这应该是关于“回滚怎么办”的设计问题,而不是原子性。
return redis.call("INCR",KEYS[1]) else local i = ARGV[1]+1 redis.call("SET", KEYS[1],i) return i end```
- undefined