EXEC

EXEC

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

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

  • 可用版本:
  • >= 1.2.0

  • 时间复杂度:

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

  • 返回值:

事务块内所有命令的返回值,按命令执行的先后顺序排列。

当操作被打断时,返回空值 nil

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