redis事务

redis事务

注意:我使用的版本是6.0.10,不同版本可能略有差别

redis事务就是一组命令的集合,一个事务中所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入

  • Redis的事务仅仅是保证事务里的操作会被连续独占的执行,因为是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的

  • Redis的事务没有隔离级别的概念,因为事务提交前任何指令都不会被实际执行,也就不存在事务内的查询要看到事务里的更新,在事务外查询不能看到这种问题了

  • Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力

事务的常用命令

  • multi 标记一个事务块的开始,后续命令逐个放入队列中
  • exec 执行事务块的命令
  • discard 取消事务,丢弃事务块的命令
  • watch key [key …] 监视key,如果在事务执行之前,这个key被其他命令所改动,则事务中断
  • unwatch 取消监视所有key

事务的执行

#标注事务的开始
MULTI
OK
#在事务内部的操作全是入队,不会真正执行
set tran1 v1
QUEUED
set tran2 v2
QUEUED
#执行
exec
1) OK
2) OK

redis的事务没有隔离级别的概念,并且不会保证原子性

  • 如果任何一个命令语法有错,Redis会直接返回错误,所有的命令都不会执行
  • 如果某个命令执行错误,那么其它的命令仍然会正常执行,然后在执行后返回错误信息
  • Redis不提供事务回滚的功能,开发者必须在事务执行出错后,自行恢复数据库状态

watch监视

watch指令类似于乐观锁,在事务开始之前使用,如果在watch之后有任何所监视的key发生变化,exec指令所执行的事务将会被放弃,当 EXEC 被调用后,所有的之前被监视的键值会被取消监视,不管事务是否被取消或者执行。并且当客户端连接丢失的时候,所有东西都会被取消监视

#设值
set balance 100
OK
#监视
watch balance
OK
#修改
set balance 200
OK
get balance
"200"
#开启事务
MULTI 
OK
#修改入队
DECRBY balance 10
QUEUED
#执行失败
exec
(nil)
get balance
"200"

redis只能保证事务中的操作顺序执行,但是如果事务中有一条命令失败了,并不会回滚其他命令

https://zhhll.icu/2021/数据库/非关系型数据库/redis/基础/8.redis事务/

本文由mdnice多平台发布

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拾光师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值