目录
3.5:WATCH:监控一个或多个key,如果在事务执行之前key被其他命令动过,那么当前事务被打断
写在前面
既然redis是(非关系型)数据库,那么会不会像关系型数据库(mysql)一样支持事务呢,那么redis的事务是什么呢,事务可以带来哪些便捷,我们怎么用事务等等
开工
1:是什么
可以一次执行多个命令,本质是一组命令的集合,一个事务中的所有命令都会被序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞
2:能做什么
一个队列中,一次性,顺序性,排他性的执行一系列命令
3:怎么做
命令:
3.1:MULTI:开启一个事务
3.2:EXEC:执行(commit)
3.3:DISCARD:放弃当前事务,放弃队列中所有命令
3.4:UNWATCH:取消所有监控的key
3.5:WATCH:监控一个或多个key,如果在事务执行之前key被其他命令动过,那么当前事务被打断
4:几种常见的事务
4.1:正常执行
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
4.2:放弃事务
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> set k2 22
QUEUED
127.0.0.1:6379> set k3 33
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get k3
"v3"
4.3:全部失败
queue里面的命令都没有被执行,加入队列出问题
127.0.0.1:6379> FLUSHALL
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> set k3 v3
QUEUED
127.0.0.1:6379> getset k3
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5
(nil)
4.4:失败部分
加入队列没有问题,执行有问题
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> EXEC
1) OK
127.0.0.1:6379> set k1 aa
OK
127.0.0.1:6379> get k1
"aa"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> get k1
"aa"
总结
redis的事务并没有像mysql一样可以完整的支持事务,redis只能部分支持事务,这个也是redis的先天性所决定的,redis就是用来做缓存的,支持事务只是它的一个副业而已。