Open
Description
Redis-事务中提到 “WATCH 命令用于监听指定的键,当调用 EXEC
命令执行事务时,如果一个被 WATCH
命令监视的键被修改的话,整个事务都不会执行,直接返回失败”。这个说法似乎不太准确,这里以下面 3 个demo进行说明。
- 同一个session中,watch监视的key在multi之前被修改
根据测试结果可以得知,如果在 MULTI 之前被修改,那么这个事务不会被执行 - 同一个session中,watch监视的key在事务内部被修改
根据测试结果可以得知,如果在 MULTI 之后被修改或者说在事务内部被修改,那么这个事务还是会执行成功 - 同一个session中,watch监视的key在事务内部被修改,但是在事务提交之前被其他 session 修改
可以看出,场景一和场景三其实可以当成同一种情况;另外,WATCH 操作只是 session 级别的,不会影响其他 session,在同一个 session 中,对于同一个 Key ,在事务执行之前最多只能加一个 WATCH,WATCH 监视的 Key 在事务内部被修改后,无论这个事务是否执行成功,这个 Key 上的 WATCH 就会自动取消(有兴趣的同学可以自行验证)可以得出结论:
只有当 WATCH 与 事务 在同一个 session 里,并且被 WATCH 监视的Key,第一次被修改的操作在事务内部,这个事务才会执行成功