Redis学习(四) -- Redis的事务

一、什么是Redis的事务

关于事务,我们常熟知的是mysql的事务,即隔离性、持久性、原子性、一致性。
而Redis的事务呢?
我们知道,redis单条命令是保证原子性的,但是redis的事务并不能保证原子性。
redis事务通俗的来说,就是一组命令的集合,一次性执行。一个事务中的所有命令都会被序列化,在事务的执行过程中,会按照顺序执行。
redis事务中没有隔离级别的概念。
创建事务后,事务中的命令都会按顺序入队列,但这时并没有被执行!而是在发起执行事务命令时才会按顺序执行事务中的命令!
redis事务命令的过程:

  1. 创建事务(multi命令)
  2. 命令入队
  3. 执行事务(exec命令)

二、创建事务并执行

在这里插入图片描述

127.0.0.1:6379> multi # 创建事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> exec # 执行事务,这里的返回结果依次就是事务中的命令按顺序执行的结果
1) OK
2) OK
3) "v1"

三、放弃事务

在这里插入图片描述

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get k3
(nil)
127.0.0.1:6379> get k4
(nil)

四、事务中的异常

这里我们根据Java中的分类,即编译型异常和运行时异常来测试。

1、编译型异常

在这里插入图片描述
这里我们可以得出结论,如果是编译型异常,那么事务中的所有命令都不会被执行!

127.0.0.1:6379> multi
OK
127.0.0.1:6379> getset k5
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

2、运行时异常

在这里插入图片描述
这里我们可以得出结论,运行时异常的话,redis的事务执行,只有命令执行异常的那条命令没有执行,其余正常的命令都被执行了,由此可见,redis的事务没有原子性,即要么都失败,要么都成功。这点和mysql的事务不一样!

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k7 a
QUEUED
127.0.0.1:6379> incr k7
QUEUED
127.0.0.1:6379> set k8 v8
QUEUED
127.0.0.1:6379> get k8
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) "v8"

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值