Skip to content

Redis:WATCH 命令碰到 MULTI 命令时的不同效果 #1714

Open
@MarlonDML

Description

@MarlonDML

Redis-事务中提到 “WATCH 命令用于监听指定的键,当调用 EXEC 命令执行事务时,如果一个被 WATCH 命令监视的键被修改的话,整个事务都不会执行,直接返回失败”。这个说法似乎不太准确,这里以下面 3 个demo进行说明。

  1. 同一个session中,watch监视的key在multi之前被修改
    image
    根据测试结果可以得知,如果在 MULTI 之前被修改,那么这个事务不会被执行
  2. 同一个session中,watch监视的key在事务内部被修改
    image
    根据测试结果可以得知,如果在 MULTI 之后被修改或者说在事务内部被修改,那么这个事务还是会执行成功
  3. 同一个session中,watch监视的key在事务内部被修改,但是在事务提交之前被其他 session 修改
    image

可以看出,场景一和场景三其实可以当成同一种情况;另外,WATCH 操作只是 session 级别的,不会影响其他 session,在同一个 session 中,对于同一个 Key ,在事务执行之前最多只能加一个 WATCHWATCH 监视的 Key 在事务内部被修改后,无论这个事务是否执行成功,这个 Key 上的 WATCH 就会自动取消(有兴趣的同学可以自行验证)可以得出结论:

只有当 WATCH事务 在同一个 session 里,并且被 WATCH 监视的Key,第一次被修改的操作在事务内部,这个事务才会执行成功

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request or suggestion

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions