什么是事务
redis执行指令过程中,多条连续执行的指令被干扰,打断,插队
redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体,当执行时一次性按照添加顺序依次执行,中间不会被打断或干扰
- Redis单条命令保存是原子性的,但事务不保证原子性
- Redis没有隔离级别的事务(所有命令在事务中并没有被直接执行,只有发起执行命令才会执行 Exec)
事务特征:一次性、顺序性、排他性
事务基本操作事务命令
-
开启事务
multi
设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中
-
执行/提交事务
exec
设定事务的结束位置,同时执行事务,与multi成对出现
注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
-
取消事务
discard
种植当前事务的定义,发生在multi之后,exec之前
事务的工作流程
开启事务(multi) 命令入队(XXX命令) 执行(exec) 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set tx1 test1 QUEUED 127.0.0.1:6379(TX)> set tx2 test2 QUEUED 127.0.0.1:6379(TX)> exec 执行事务 / discard 放弃事务,上述命令不执行 1) OK 2) OK
事务中两种异常
- 1.编译性异常也就是语法错误(入队命令有问题),则所有事务中的命令都不执行
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)> getset (error) ERR wrong number of arguments for 'getset' command # 放入一个错误命令 127.0.0.1:6379(TX)> set k3 v3 QUEUED 127.0.0.1:6379(TX)> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> keys * (empty array) 命令都未执行
- 2.运行时异常,则其他命令执行,错误命令抛出异常
127.0.0.1:6379> set k1 "v1" #字符串 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> incr k1 # 累加 构造错误:对一个string型+1 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> exec 1) (error) ERR value is not an integer or out of range # 第一个命令报错 2) OK # 第二个命令正常执行



