关于 redis的watch

> set key 0
OK
> watch key
OK
> incrby key 5
(integer) 5
> get key
"5"
> multi
OK
> incrby key 5
QUEUED
> exec
(nil)

> multi
OK
> incrby key 5
QUEUED
> exec
1) (integer) 10
> get key
"10"

发现 watch 只能阻止最近的一次事务。这让我瞬间懵了。
如果在并发的情况下,同一个事务代码被执行了多次。watch 只能阻止第一次吗??
那 watch 的应用场景在哪里?

阅读 2.2k
1 个回答

watch 属于 CAS 的机制,并发情况下,watch 的时候,大家的链接都记住了这个 key 的状态,然后大家都开始 multi 开启事务,大家都愉快的修改了这个值,修改完后,大家发出 exec 命令,大家都要去提交事务, 这个时候,每个链接要去比较这个时候的 key 的状态和 watch 的时候是不是一样,如果是一样,就提交事务,并取消 watch,不一样,就报错,不执行事务,但是由于 redis 一次只能执行一个操作,所以,大家的 exec 都是排队的执行的,第一个exec 执行之后,key的状态发生了变化,后面的exec 都会出错了.

来张图
5-1ZH4122J5538.png

事务执行结束就会取消监控, 每次执行事务,都要去执行一次 watch,这个不难理解吧. 你为啥会想着执行一次 watch 后跑多个事务呢?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题