1. Redis事务可以一次执行多个命令, 并且带有以下三个重要的保证:
1.1. 批量操作在发送exec命令前被放入队列缓存。
1.2. 收到exec命令后进入事务执行, 事务中任意命令执行失败, 其余的命令依然被执行。
1.3. 在事务执行过程, 其他客户端提交的命令请求不会插入到事务执行命令序列中。
2. 一个事务从开始到执行会经历以下三个阶段:
2.1. 开始事务。
2.2. 命令入队。
2.3. 执行事务。
3. 单个Redis命令的执行是原子性的, 但Redis没有在事务上增加任何维持原子性的机制, 所以Redis事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本, 但批量指令并非原子化的操作, 中间某条指令的失败不会导致前面已做指令的回滚, 也不会造成后续的指令不做。
4. watch命令
4.1. watch命令用于监视一个(或多个)key, 如果在事务执行之前这个(或这些)key被其他命令所改动, 那么事务将被打断。
4.2. 语法: watch key [key ...]。
4.3. 总是返回OK。
5. unwatch命令
5.1. unwatch命令用于取消watch命令对所有key的监视。
5.2. 语法: unwatch。
5.3. 总是返回OK。
6. multi命令
6.1. multi命令用于标记一个事务块的开始。
6.2. 事务块内的多条命令会按照先后顺序被放进一个队列当中, 最后由exec命令原子性(atomic)地执行。
6.3. 语法: multi。
6.4. 总是返回OK。
7. exec命令
7.1. exec命令用于执行所有事务块内的命令。
7.2. 语法: exec。
7.3. 假如某个key(或某些)正处于watch命令的监视之下, 且事务块中有和这个(或这些)key相关的命令, 那么exec命令只在这个(或这些)key没有被其他命令所改动的情况下执行并生效, 否则该事务被打断(abort)。
7.4. 事务块内所有命令的返回值, 按命令执行的先后顺序排列。 当操作被打断时, 返回空值nil。
7.5. 一个带监听的正常事物流程
7.6. 一个带监听的被打断的时候流程
7.6.1. 客户端一
7.6.2. 客户端二
8. discard命令
8.1. discard命令用于取消事务, 放弃执行事务块内的所有命令。
8.2. 如果正在使用watch命令监视某个(或某些)key, 那么取消所有监视, 等同于执行命令unwatch。
8.3. 语法: discard。
8.4. 总是返回OK。