12.Redis 基本事务操作
Redis 事务的本质:多条命令的集合!一个事务种所有命令都会被序列化,事务执行的过程中,会按照顺序执行!顺序性、排他性!执行一些列的命令!
------ 队列 set set set 执行
Redis 事务没有隔离级别的概念!
所有的事务在命令中并没有被执行!只有发起执行命令的时候才会执行!
Redis 单条命令保证原子性(要么同时成功,要么同时失败)的,但是事务不保证原子性!
redis 事务:
开启事务 multi
命令入队 ......
执行事务 exec
正常执行事务
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec # 执行事务
1) OK
2) OK
3) "v1"
127.0.0.1:6379>
编译型异常(命令有错)
所有指令都不执行
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> clear
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> gett k3 # 指令语法错误,属于编译异常
(error) ERR unknown command 'gett', with args beginning with: 'k3'
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
运行时异常(1/0型)
其他指令照常执行,异常指令抛出异常信息
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> clear
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 "v1"
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> incr k1 # 字符串不能+1,指令无错,运行时异常
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "v2"
4) (error) ERR value is not an integer or out of range
127.0.0.1:6379>
放弃事务
discard放弃全部入队的指令
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379>
127.0.0.1:6379> get k2
(nil)
127.0.0.1:6379>