Redis 事务失效或取消执行命令的场景

1 概述

(1)Redis 事务失效的场景:

事务中的部分命令执行失败

(2)Redis 取消执行事务中的所有命令(Redis清空队列中的全部命令并取消事务)的场景:

部分命令入队失败、乐观锁失败

2 事务中的部分命令执行失败

事务提交后开始顺序执行命令,之前缓存在队列中的部分命令执行失败,但事务不会自动回滚,从而导致事务失效。

示例代码如下:

127.0.0.1:6379> multi				
OK
127.0.0.1:6379> set name jack 	
QUEUED
127.0.0.1:6379> set age 16			
QUEUED
127.0.0.1:6379> lpush age 18		
QUEUED
127.0.0.1:6379> exec 				# 提交事务后开始顺序执行命令,第三条命令执行失败
1) OK
2) OK
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value    # key重复导致命令执行失败
127.0.0.1:6379> get name 			# 第三条命令执行失败,但没有将前两条命令回滚
"jack"

3 部分命令入队失败

在事务提交之前,客户端执行的命令入队列失败,比如命令的语法错误(命令参数个数错误,不支持的命令等等)。

如果发生这种类型的错误,Redis将向客户端返回包含错误提示信息的响应,同时Redis会清空队列中的所有命令并取消事务。

示例代码如下:

127.0.0.1:6379> set name jack 	# 事务之前执行
OK
127.0.0.1:6379> multi 				# 开启事务
OK
127.0.0.1:6379> set name lily 	# 事务中执行,命令入队列
QUEUED
127.0.0.1:6379> setset name lucy 	# 错误的命令,模拟失败场景
(error) ERR unknown command `setset`, with args beginning with: `name`, `lucy`,

127.0.0.1:6379> exec				# 提交事务,发现由于上条命令的错误导致事务已经自动取消了
(error) EXECABORT Transaction discarded because of previous errors.

127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> get name 			# 查询name,发现未被修改
"jack"

4 乐观锁失败

Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

watch 监控 key 所起的作用实际上是一个乐观锁,它所监控的是在事务期间所监控的值有没有被修改,如果被修改了,说明乐观锁失败。

由于乐观锁失败,事务提交时将丢弃之前缓存的所有命令。

(1)在事务执行之前 key 没有被其他命令所改动,事务中的命令执行成功。

127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
"jack"
127.0.0.1:6379> watch name   # watch 给name加乐观锁
OK
127.0.0.1:6379> multi  # 在事务执行之前 key 没有被其他命令所改动
OK
127.0.0.1:6379> set name tom
QUEUED
127.0.0.1:6379> exec     # 
1) OK
127.0.0.1:6379> get name
"tom" 

(2)在事务执行之前 key 被其他命令所改动,事务提交时将丢弃之前缓存的所有命令,事务中的命令执行失败。

127.0.0.1:6379> set name lily
OK
127.0.0.1:6379> get name
"lily"
127.0.0.1:6379> watch name  # watch 给name加乐观锁
OK
127.0.0.1:6379> set name tom  # 修改name的值
OK
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> multi      # 在事务执行之前 key 被其他命令所改动
OK
127.0.0.1:6379> set name jack
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get name
"tom" 

5 参考文献

(1)Redis事务失效的三种场景

你可能感兴趣的:(redis,redis事务)