大数据之Redis:watch key 和unwatch

1、watch key

在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

2、使用watch

案例一:使用watch检测balance,事务期间balance数据未变动,事务执行成功

27.0.0.1:6379> watch balance#检测可用余额数,初始值为100
OK
127.0.0.1:6379> MULTI# 开启事务
ok
127.0.0.1:6379> decrby balance 20#消费20后,可用余额-20
QUEUED
127.0.0.1:6379>incrby debt 20#应还余额+20
QUEUED
127.0.0.1:6379> EXEC# 执行事务
1)(integer)80 
2)(integer)20

案例二:使用watch检测balance,在开启事务后(标注1处),在新窗口执行标注2的操作,更改balance的值,模拟其他客户端在事务执行期间更改watch监控的数据,然后再执行标注1后命令,执行EXEC后,事务未成功执行。

```powershell
27.0.0.1:6379> watch balance#检测balance的值,初始为为80
OK
127.0.0.1:6379> MULTI# 开启事务(标注1)
ok
127.0.0.1:6379> decrby balance 20#可用余额-20
QUEUED
127.0.0.1:6379>incrby debt 20#应还余额+20
QUEUED
127.0.0.1:6379> EXEC# 执行事务
(nil)#事务失败
127.0.0.1:6379>get balance 
"800"
127.0.0.1:6379>get balance #查看balance值
"80"
127.0.0.1:6379>set balance 800 #修改balance值
ok

watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。

3、unwatch

取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了

4、三特性

单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

没有隔离级别的概念
队列中的命令没有提交(exec)之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题 ;

不保证原子性
Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值