Redis——事务操作
一、概述
在Redis事务的本质,是一组命令的集合。一个事务内的所有命令会被序列化,然后在事务执行的过程中,被依次执行。
Redis的单条事务是保持原子性的,但是Redis的事务是不能保证原子性的
二、Redis事务的使用
- 开启事务
multi - 命令入队
即写入要执行的各条命令 - 执行命令 / 放弃命令
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非常类似
- 编译时异常
即由于命令语法有问题在命令入队的过程中被检查出来,此时事务内的命令都不会被执行
- 编译时异常
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.
- 运行时异常
也可以说,由于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"