127.0.0.1:6379> MULTI #开启事务 OK #命令入队 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> get k2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED # 执行事务 127.0.0.1:6379> exec 1) OK 2) OK 3) "v2" 4) OK
放弃事务
1 2 3 4 5 6 7 8 9 10 11 12 13
127.0.0.1:6379> MULTI # 开启事务 OK 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> DISCARD # 取消事务 OK 127.0.0.1:6379> get k4 # 事务队列中命令都不会被执行 (nil)
异常
编译型异常(代码有问题!命令有错),事务中所有的命令都不会被执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set k1 v1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> getset k3 (error) ERR wrong number of arguments for'getset'command 127.0.0.1:6379> set k4 v4 QUEUED 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get k4 (nil)
127.0.0.1:6379> set k1 "v1" OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> INCR k1 QUEUED 127.0.0.1:6379> set k2 v2 QUEUED 127.0.0.1:6379> set k3 v3 QUEUED 127.0.0.1:6379> get k3 QUEUED 127.0.0.1:6379> EXEC 1) (error) ERR value is not an integer or out of range 2) OK 3) OK 4) "v3" 127.0.0.1:6379> get k2 "v2"
127.0.0.1:6379> set money 100 OK 127.0.0.1:6379> set out 0 OK 127.0.0.1:6379> WATCH money # 监视money 对象 OK 127.0.0.1:6379> MULTI # 事务正常结束,数据期间没有发生变动,这个时候就正常执行成功 OK 127.0.0.1:6379> DECRBY money 20 QUEUED 127.0.0.1:6379> INCRBY out 20 QUEUED 127.0.0.1:6379> EXEC 1) (integer) 80 2) (integer) 20