redis中的事务操作

事务

把一组数据库命令放在一起执行,保证操作原子性,要么同时成功,要么同时失败
允许把一组redis命令放在一起,把命令序列化,然后一起执行,保证部分原子性

multi:用来标记一个事务的开始
例如

multi
set k1 v1 
set k2 v2

这样子就会把命令放到队列中等待执行

exec:用来执行事务队列中的命令

exec //相当于mysql中的提交

在这里插入图片描述

redis事务只能保证部分原子性

如果一组命令中,有在压入事务队列过程中发生错误的命令,则在本事务中所有的命令都不执行,能够保证事务的原子性

保持全部原子性

multi
set k3 v3
setaa k4 v4
set k5 v5
exec

因为在setaa是命令错了,在压入队列的时候就报错了,所以这样子是可以保持数据原子性的

保持部分原子性

如果一组命令中,在压入队列过程中正常,但在执行事务队列命令发生了错误,则只会影响发生错误的命令,不会影响其他命令
的执行,不能保证事务的全部原子性

multi
set kk3 vv3
incr kk2 //这里会报错,因为不是数值类型
set kk4 vv4
exec

在这里插入图片描述

discard:清除所有已经压入队列中的命令,并且结束整个事务

multi
set kk5 vv5
set kk6 vv6 
sidcard

在这里插入图片描述

redis中的乐观锁
watch:监控某一个键,当事务在执行过程中,此键的值如果发生变化,则本事务放弃执行

就是说,如果在某次修改过程中,该键的值发生变化,就会执行失败,这个键变化,就代表在此过程中,别的用户已经修改过了,或者说,改操作如果继续修改下去,数据就会变得不一致了

//客户一执行
set balance 50 //客户的值
set balance1 5000 //服务商的值
set version //被监控的值,该值起到区分是否修改过(本来事务中)
watch version //开启监听
multi //开启事务
desrby balance 20 //客户的值执行减操作
incrby balance1 20 /服务商的值进行加操作

但是在此过程中,该客户在另外一个终端也进行了操作

客户二的操作

set version 2

所以,在该次操作中,就已经是被改过了,由于客户一的执行并没有结束,所以继续执行就会发生失败了
客户一的操作
在这里插入图片描述
顺序:客户一在监听version键后,事务还没有执行结束,客户二在客户一监听version键后,去改变了version的值,然后客户一再去操作

放弃监控所有键

unwatch:放弃监控所有键

单独的隔离操作:

事务中的所有命令都会被序列化,顺序的执行,事务在执行过程中,不会被其他客户端发来的命令请求所打断

不保证事务的原子性:

redis同一个事务如果一条命令执行失败,其后的命令依然会被执行,redis的事务没有回滚。redis已经在系统内部进行功能简化,因为可以保证更快的运行速度,所有redis是不需要回滚事务的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小信啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值