在 Redis
中使用 watch
命令可以决定事务最终是执行还是回滚。通常情况下,会在multi
命令之前使用 watch
命令监控某些键值对,然后使用 multi
命令开启事务,执行各种对数据结构进行操作的命令,这个时候这些命令并不会立刻执行,而是进入队列等待后续执行的操作。
当 Redis
使用 exec
命令执行事务的时候,它首先会去比对被 watch
命令所监控的键值对,如果没有发生变化,那么它会执行事务队列中的命令,提交事务;如果发生变化,那么它不会执行任何事务中的命令,而去事务回滚。无论事务是否回滚,Redis
都会去取消执行事务前的 watch
命令,这个过程如下图所示:
Redis使用Watch机制实现乐观锁是基于CAS(Compare And Swap)思想(比较并替换),是不具有互斥性,不会产生锁等待而消耗资源,但是需要反复的重试,但也是因为重试的机制,能比较快的响应。因此我们可以利用redis来实现乐观锁。具体思路如下: