1 介绍
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
2 命令
- 开启事务并执行
127.0.0.1:6379> MULTI # 开启事务
OK
127.0.0.1:6379> set name pky # 将命令入队
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> GETSET name pkyshare
QUEUED
127.0.0.1:6379> del name
QUEUED
127.0.0.1:6379> EXEC # 执行事务
1) OK
2) "pky"
3) "pky"
4) (integer) 1
- 开启事务取消执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set name pky
QUEUED
127.0.0.1:6379> get name
QUEUED
127.0.0.1:6379> DISCARD # 取消事务
OK
127.0.0.1:6379> get name
(nil)
- 事务中命令错误(类似 Java 中的编译型异常),事务中的所有命令都不会执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set num1 1
QUEUED
127.0.0.1:6379> get num1
QUEUED
127.0.0.1:6379> getset num2 # 错误的命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> getset num3 3
QUEUED
127.0.0.1:6379> EXEC # 执行事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get num1 # 以下两个命令可以看出,事务中的命令没有被执行
(nil)
127.0.0.1:6379> get num3
(nil)
- 事务中命令逻辑错误(类似 Java 中的运行时异常),事务中错误命令抛异常,其他命令正常执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set num1 1
QUEUED
127.0.0.1:6379> set num2 pky
QUEUED
127.0.0.1:6379> INCR num1
QUEUED
127.0.0.1:6379> INCR num2 # 对字符串 + 1
QUEUED
127.0.0.1:6379> set num3 3
QUEUED
127.0.0.1:6379> INCR num3
QUEUED
127.0.0.1:6379> EXEC
1) OK # 其他命令正常执行
2) OK
3) (integer) 2
4) (error) ERR value is not an integer or out of range # 抛出异常
5) OK
6) (integer) 4
127.0.0.1:6379> get num1
"2"
127.0.0.1:6379> get num2
"pky"
127.0.0.1:6379> get num3
"4"
127.0.0.1:6379>