事务
参考
01-redis安装:how2j.cn/k/redis/red…
02-redis学习:<Redis开发与运维>(获取本书PDF见文章末)
03-b站
1.介绍
Redis可以一次执行多个命令
- Redis会将命令进行序列化执行,依次按顺序执行。
- 执行期间,不会被其它命令插入,不允许加塞操作。
2.过程
- 开始事务(multi)
- 命令入队(queue)
- 执行事务(exec)
3.命令示例
(1)MULTI EXEC
需求:转账场景:A转账给B100元。
描述:
- 输入multi命令后开始,输入的命令依次被放在队列中,但是不会被执行。
- 直到输入exec命令后,队列里面的命令才会执行。
命令:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set A 200
QUEUED
127.0.0.1:6379> set B 20
QUEUED
127.0.0.1:6379> decrby A 100
QUEUED
127.0.0.1:6379> incrby B 100
QUEUED
127.0.0.1:6379> get A
QUEUED
127.0.0.1:6379> get B
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (integer) 100
4) (integer) 120
5) "100"
6) "120"
(2)DISCARD放弃队列运行
描述:
- 输入multi命令开始后,所以的命令都会依次进入队列中,但是不会被执行。
- 命令在队列过程中,可以执行命令discard命令来放弃队列运行。
命令:
127.0.0.1:6379> get A
"100"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby A 250
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get A
"100"
(3)事务错误处理(一)
描述:
如果在执行过程中,出现了错误,那么只有这个报错的命令不会被执行,其它命令会继续执行,不会回滚。
命令:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set F hello
QUEUED
127.0.0.1:6379> incr F
QUEUED
127.0.0.1:6379> set K aaa
QUEUED
127.0.0.1:6379> get K
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) "aaa"
(4)事务错误处理(二)
描述:
队列中出现了报告错误,则整个队列都会被取消。
命令:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 123
QUEUED
127.0.0.1:6379> setffff
(error) ERR unknown command 'setffff'
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
(5)事务中的WATCH
需求:张三在A账户在事务内进行操作,操作期间,王五对A账户进行操作。
命令:
watch:监视一个key或者多个key,事务执行之前这个key被其它命令所改动,那么事务将被打断。
4.应用场景
前提:
- 一组命令要么同时都执行,要么都不执行。
- 我们想要保证一组命令在执行过程中,不被其它命令插入。
场景:
- 秒杀活动。
- 转账活动。
链接:关注公众号Elevenkeep,回复redis即可获得链接。