事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令
127.0.0.1:6379> multi OK 127.0.0.1:6379> zadd result 123 php QUEUED 127.0.0.1:6379> zadd result 11 php QUEUED 127.0.0.1:6379> exec 1) (integer) 0 2) (integer) 0
Redis保证一个事务中的所有命令要么都执行,要么都不执行。
如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。
而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令
错误处理
exec 完
如果有一个命令执行错误了,那么后面的命令将不会执行,但是之前的语句却全都执行了.. 但是redis 并没有提供回滚功能,所有的烂摊子必须由开发者处理
Watch
如果需要对一个键的值++,但是在执行的时候其他客户端又对这个值修改了
监听一个变量在执行事务的时候是否被修改了,如果被修改了事务取消
监听完这个变量,只要不是在事务里头修改的那就是要取消的
执行exec 之后会对所有的键取消监控
watch 监听的键过期了,不会认为该键被改变
127.0.0.1:6379> set count 1 OK 127.0.0.1:6379> watch count OK 127.0.0.1:6379> set count 2 QUEUED 127.0.0.1:6379> multi OK 127.0.0.1:6379> set count 3 QUEUED 127.0.0.1:6379> exec (nil)
!!!