Redis11事务


Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行的过程中,会按照顺序执行

一次性,顺序性,排他性(事务在执行过程中不允许被别人干扰)执行一系列的命令

Redis事务没有隔离级别的概念

所有命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec

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 k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "v2"
4) OK

取消事务

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k9 v9
QUEUED
127.0.0.1:6379> DISCARD (取消事务)
OK
127.0.0.1:6379> get k9
(nil)

编译时异常,队列里面所有命令都不会被执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> getset k1
(error) ERR wrong number of arguments for 'getset' command  (队列里出现了err,则所有命令都不成功)
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k2
(nil)

运行时异常,语法没错,运行时错了,则那一个命令执行失败,队列里面其他命令执行成功

127.0.0.1:6379> MULTI

OK
127.0.0.1:6379> set k1 "v1"
QUEUED
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
3) "v1"