Redis笔记 -- 事务

1. 事务介绍

Redis事务可以一次执行多个命令,本质是一组命令的集合,这些命令按顺序地串行化执行而不会被其他命令插入

其具有以下特点:

  1. Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的
  2. 没有隔离级别概念。因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了
  3. 不保证原子性。Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
  4. 排他性。Redis会保证一个事务内的命令依次执行,而不会被其它命令插入

2. 常用命令

  • discard :取消事务,放弃执行事务块内的所有命令
  • exec:执行所有事务块内的命令
  • multi:标记一个事务块的开始
  • unwatch:取消watch命令对于所有key的监视
  • watch key[key...]:监视一个或多个key,如果在事务执行之前,这个(些)key被其他命令所改动,那么事务就会执行失败

举例:

watch k2
MULTI
set k1 v1
set k2 v2
set k3 v3
exec

可以看到,在multiexec中的就是事务块的所有命令,这三条命令将被顺序连续执行,不会被别的命令插入执行。如果事务执行时,也就是exec时,如果发现k2被修改,那么该事务就会执行失败。

3. 特殊情况

3.1 如果在事务执行之前就出现错误(大多是语法错误),那么事务执行时,所有命令都不会被执行。

例如:

MULTI
set k1 v1
set k2 
set k3 v3
exec

可以看到,存在语法错误,set k2 语句中缺少了value,在这种情况下,第一条语句set k1 v1也是无效的,执行失败的。

3.2 如果语法没有错误,执行时出现了错误,那么,只有出现错误的语句执行失败,其他语句正常执行。

例如:

MULTI
set k1 v1
incr k2 
set k3 v3
exec

在上述例子中,由于k2的值是string类型,不能使用incr命令,因此在事务执行时会出现错误。但在这种情况下,并不会影响其他语句的正常执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值