Redis-事务

简介

Redis事务操作的基础命令有MULTI, EXEC, DISCARD 和WATCH命令。

特点

  • 事务中的所有命令都是序列化并且单独执行的,在事务执行时,将不会接受其他任何一个客户端发出的请求。
  • 事务中的所有命令,要么全部被执行,要么全部没有被执行。

MULTI

使用该命令进入事务模式,在执行完成该命令后,后续输入的Redis命令将会进入事务队列。
在这里插入图片描述

DISCARD

该命令可以清除事务队列中的所有命令,然后退出事务。
在这里插入图片描述

EXEC

该命令会使事务队列中的所有命令被一次性执行。
在这里插入图片描述

错误

语法错误

如果返回值是 QUEUED ,那么它就是成功, 不然就是失败,Redis会返回一个错误。如果在命令的队列期间发出一个错误,通常的做法是,终止事务。
在这里插入图片描述
由图中结果可见,在发生语法错误时,只是对应的错误命令没有进入事务队列,后续仍然可以对事务队列进行操作,因此我们要手动停止事务。

执行错误

执行 EXEC 后:所有的命令都会被执行,甚至是那些错误的命令。Redis并不会处理错误命令,也不会进行回滚。就算有命令失败,队列中的其他命令也会被执行。我们需要自己对错误进行处理。
在这里插入图片描述

为什么没有回滚的操作

  • Redis因为速度快而出名,回滚操作明显会降低效率。
  • 运行时发生的错误在实际生产环境中几乎不会出现。

WATCH

WATCH 命令为事务提供一个check-and-set (CAS) 行为。WATCH 可以用来监听事务中的队列中的命令,在EXEC之前,一旦发现有一个命令被修改了的 , 那么整个事务就会终止, EXEC返回一个 Null ,提示用户事务失败了。
例如,当我们要对某一个数据进行加一操作时,需要执行以下命令。

value = GET key
value++
SET key value

如果在同一时间,只有一个客户端在执行上面的操作,那么上面的操作是可靠的。但如果同时有多个用户执行上面的操作的话,那结果就是不可靠的。使用 WATCH 来很好的解决这个问题,当有另一个用户在我们调用WATCH 和 EXEC之间,修改了mykey的值val,那么这个事务就会失败。

WATCH key
value = GET key
value++
MULTI
SET key value
EXEC

和此前代码不同的是,新代码在获取mykey的值之前先通过WATCH命令监控了该键,此后又将set命令包围在事务中,这样就可以有效的保证每个连接在执行EXEC之前,如果当前连接获取的mykey的值被其它连接的客户端修改,那么当前连接的EXEC命令将执行失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值