• EXEC

    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)