Redis——事务操作

一、概述

在Redis事务的本质,是一组命令的集合。一个事务内的所有命令会被序列化,然后在事务执行的过程中,被依次执行。
Redis的单条事务是保持原子性的,但是Redis的事务是不能保证原子性的

二、Redis事务的使用

  1. 开启事务
    multi
  2. 命令入队
    即写入要执行的各条命令
  3. 执行命令 / 放弃命令
    exec / discard
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> set consume 20
QUEUED
127.0.0.1:6379> set money 80
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> get money
"80"

放弃执行

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get money
"80"   -- money的值并没有发生改变

三、事务执行过程中可能发生的异常

事务执行过程中,可能会发生异常,一般分为两种,和java非常类似

    1. 编译时异常
      即由于命令语法有问题在命令入队的过程中被检查出来,此时事务内的命令都不会被执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name xiaoming
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set color
(error) ERR wrong number of arguments for 'set' command  --此时,虽然命令错了,但是事务并没有停止
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

    1. 运行时异常
      也可以说,由于redis发生运行时异常,命令只是被序列化后在队列中执行,一条命令错误后,不影响后面命令的执行,无法实现事务的原子性
127.0.0.1:6379> set money mon
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name xiaoming
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> incr money  --此处语法通过,所以不报错
QUEUED
127.0.0.1:6379> set color blue
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) OK
127.0.0.1:6379> get color  --虽然上一个命令发生错误,但是依然可以获取到下一个命令的值
"blue"

posted @ 2020-08-04 19:31  moutory  阅读(2)  评论(0编辑  收藏  举报  来源