Redis(五)事务

Redis(五)事务

可以一次执行多个命令,是一个命令组,一个事务中,所有命令都会序列化(排队),不会被插队;

一个队列中,一次性,顺序性,排他性的执行一系列命令

三特性:

  • 隔离性:所有命令都会按照顺序执行,事务在执行的过程中,不会被其他客户端送来的命令打断
  • 没有隔离级别:队列中的命令没有提交之前都不会被实际的执行,不存在“事务中查询要看到事务里的更新,事务外查询不能看到”这个头疼的问题
  • 不保证原子性:冤有头债有主,如果一个命令失败,但是别的命令可能会执行成功,没有回滚

三步走:

  • 开启multi
  • 入队queued
  • 执行exec

与关系型数据库事务相比:

  • multi:可以理解成关系型事务中的 begin
  • exec :可以理解成关系型事务中的 commit
  • discard :可以理解成关系型事务中的 rollback

一起生

开启事务,加入队列,一起执行,并成功

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> set k3 v3
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> exec					#一起执行事务
1) OK
2) OK
3) OK
4) "v1"
5) OK

一起死

放弃之前的操作,恢复到原来的值

127.0.0.1:6379> multi					#开启事务
OK
127.0.0.1:6379> set k1 v111				#加入事务队列
QUEUED
127.0.0.1:6379> set k2 v222
QUEUED
127.0.0.1:6379> discard					#放弃事务,相当于回滚
OK
127.0.0.1:6379> get k1
"v1"

一粒老鼠屎坏一锅汤

一句报错,全部取消,恢复到原来的值

127.0.0.1:6379> multi									#开启事务
OK
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> set lllll								#错误语句,报错
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> exec									#执行事务
(error) EXECABORT Transaction discarded because of previous errors.			#报错,队列命令全部取消
127.0.0.1:6379> keys *
1) "k2"
2) "k4"
3) "k3"
4) "k1"

冤有头债有主

追究责任,谁的错,找谁去

此处显示并不支持原子性

127.0.0.1:6379> multi										#开启事务
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> set k6 v6
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range		#明确错误
2) OK
3) OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k5"														#事务队列2执行成功
4) "k3" 													#事务队列3执行成功
5) "k4"
6) "k6"
127.0.0.1:6379> get k1                                      #事务队列1执行失败
"v1"

watch监控

测试:模拟收入与支出

正常情况下:

127.0.0.1:6379> set in 100							#收入   100
OK
127.0.0.1:6379> set out 0							#支出   0
OK
127.0.0.1:6379> multi								#事务开启
OK
127.0.0.1:6379> decrby in 20						#收入 - 20
QUEUED
127.0.0.1:6379> incrby out 20						#支出 + 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20

特殊情况下:

127.0.0.1:6379> watch in				#监控收入in
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby in 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
(nil)									#在执行exec之前,我开启了另一个窗口(线程),对监控的in做了修改,所以本次事务将被打断(失效),类似于“乐观锁”

unwatch:取消watch命令对所有key的操作

  • 一旦执行了exec命令,那么之前加的所有监控自动失效!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值