一、何为Redis事务
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。
相较于关系型数据库事务,Redis只支持简单的事务,它通过MULTI、EXEC、DISCARD和WATCH等命令实现事务。
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
二、命令
命令名 | 描述 |
---|---|
MULTI | 标记一个事务块的开始 |
EXEC | 执行所有事务块内的命令 |
DISCARD | 取消事务,放弃执行事务块内的所有命令 |
WATCH key [key …] | 监视一个(或多个) key ,一旦其中有一个key被修改(或删除),之后的事务就不会执行 |
UNWATCH | 取消 WATCH 命令对所有 key 的监视 |
2.1 从开始到执行事务
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> lpush a age
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> lrange a 0 -1
QUEUED
127.0.0.1:6379> exec
1) OK
2) (integer) 1
3) "20"
4) 1) "age"
2.2 取消事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 24
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get age
"20"
2.3 监视key
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> watch age
OK
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> exec
(nil)
三、特性
Redis命令的执行是原子性的,但是Redis事务不支持原子性,同时Redis事务不支持回滚。
如下图,我发起一个事务,里面有正确的命令以及错误的命令。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> del age
QUEUED
127.0.0.1:6379> del a
QUEUED
127.0.0.1:6379> lset list 0 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1
3) (error) ERR no such key
由结果我们可以看到,在执行事务时报错并不会将执行的命令回滚,而是忽略执行错误的命令,继续后面的命令。