EXEC

EXEC

执行所有事务块内的命令。

假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。

可用版本:

>= 1.2.0

时间复杂度:

事务块内所有命令的时间复杂度的总和。

返回值:

事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil

  1. # 事务被成功执行
  2. redis> MULTI
  3. OK
  4. redis> INCR user_id
  5. QUEUED
  6. redis> INCR user_id
  7. QUEUED
  8. redis> INCR user_id
  9. QUEUED
  10. redis> PING
  11. QUEUED
  12. redis> EXEC
  13. 1) (integer) 1
  14. 2) (integer) 2
  15. 3) (integer) 3
  16. 4) PONG
  17. # 监视 key ,且事务成功执行
  18. redis> WATCH lock lock_times
  19. OK
  20. redis> MULTI
  21. OK
  22. redis> SET lock "huangz"
  23. QUEUED
  24. redis> INCR lock_times
  25. QUEUED
  26. redis> EXEC
  27. 1) OK
  28. 2) (integer) 1
  29. # 监视 key ,且事务被打断
  30. redis> WATCH lock lock_times
  31. OK
  32. redis> MULTI
  33. OK
  34. redis> SET lock "joe" # 就在这时,另一个客户端修改了 lock_times 的值
  35. QUEUED
  36. redis> INCR lock_times
  37. QUEUED
  38. redis> EXEC # 因为 lock_times 被修改, joe 的事务执行失败
  39. (nil)

原文: https://wizardforcel.gitbooks.io/redis-doc/content/ref/124.html