前言
redis没有关系型数据库那么强的事务控制。仅可以使用multi、exec、discard等命令实现简单的事务控制。但是事务不会因为操作失败而回滚,也不保证全部成功。(所以≈没卵用)只是单纯的事务内操作顺次提交而已。
开启事务
使用multi命令开启事务,开启事务后执行的操作会进入一个队列,事务提交后顺次执行。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zmc
QUEUED <==================操作进入队列
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex male
QUEUED
提交事务
使用exec命令提交事务后,从队列中顺次执行操作,并返回执行结果。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zmc
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex male
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"
放弃事务
使用discard命令放弃事务提交后,退出事务状态,且不提交之间的操作。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name1 RzZ
QUEUED
127.0.0.1:6379> set name2 DT
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"
事务失败
-
失败不回滚
当一个事务中,某一个操作失败时,redis并不会将已执行的操作进行回滚。
127.0.0.1:6379> multi OK 127.0.0.1:6379> set addr sz QUEUED 127.0.0.1:6379> incr age QUEUED 127.0.0.1:6379> incr name QUEUED 127.0.0.1:6379> exec 1) OK 2) (integer) 19 3) (error) ERR value is not an integer or out of range <=============这里执行失败了 127.0.0.1:6379> keys * 1) "sex" 2) "age" 3) "addr" 4) "name" 127.0.0.1:6379> get age "19" <=============但是这两个操作正常提交了 127.0.0.1:6379> get addr "sz"
-
失败不中断
事务执行时必然执行完所有操作,即时中间抛出错误,也不影响后面的操作。
127.0.0.1:6379> exec 1) (integer) 20 2) (error) ERR value is not an integer or out of range <=============这里执行失败了 3) (integer) 1 127.0.0.1:6379> get age "20" 127.0.0.1:6379> get addr (nil) <=============但是这个操作正常提交了