在执行事务时,要不全执行,要不全不执行。Redis 事务我个人认为不是严格意义上的事务,只是用于帮助用户在一个步骤中执行多个命令。它是通过multi['mʌlti] 表示开启事务,EXEC执行事务,discard 丢失任务。当我们开启事务,它是把redis语句存储在一个队列中,只有我们提交事务的时候才会执行这些指令,错误的指令会报错,而之前执行过的正确指令仍然正常执行,不会回滚,所以并不支持事务的回滚,也不能保证事务的原子性。
PS:有一种情况我们需要注意,在组队的过程中,如果redis命令错了,例如set命令写成了set1,整个队列中所有的命令都会被取消。
PS: watch监听
-
WATCH:在执行multi之前,先执行watch key1 [key2 …],可以监视一个或者多个key,若在事务的exec命令之前这些key对应的值被其他命令所改动了,那么事务中所有命令都将被打断,即事务所有操作将被取消执行。
-
unwatch:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。
-
注意:Redis 禁止在 multi 和 exec 之间执行 watch 指令,而必须在 multi 之前做好盯住关键变量,否则会出错。