1 简介
redis中的事务(transaction)是一组命令的集合。事务要么全部执行,要么全部失败
例如
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SADD "user:1:following" 2
QUEUED
127.0.0.1:6379> SADD "user:2:followers" 1
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 1
注意上面发送两个SADD请求时,返回了QUEUED结果,表示这两条命令进入了等待执行的队列中,当执行EXEC命令时,才会执行队列里面的内容。如果执行EXEC命令前,客户端断线了,redis会清空事务队列。
redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入(事务的隔离性)
2 错误处理
2.1 语法错误
语法错误指命令不存在或者命令的参数不对。例如
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set name 'zhangsan'
QUEUED
127.0.0.1:6379> sget name
(error) ERR unknown command 'sget'
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
注意:事务队列中,只要有一个语法错误,执行EXEC命令后Redis会直接返回错误,队列中语法正确的命令也不会执行
2.2 运行错误
运行错误是指命令执行时出现的错误,这种错误在实际执行之前Redis是无法发现的,所以在redis事务中这样的命令是会被Redis接受并执行的。如果事务里的一条命令出现了错误,事务里其它的命令仍然会依次执行(包括出错语句之后的语句),例如
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key 1
QUEUED
127.0.0.1:6379> sadd key 2
QUEUED
127.0.0.1:6379> set key 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get key
"3"
注意:redis不支持回滚(rollback)的功能
3 watch 命令
在有些情况下,需要先获取一条命令的返回值,然后再根据这个值执行下一条命令。
watch命令可以监控一个键或者多个键,一旦其中一个键被修改(或删除),之后的事务都不会被执行。监控一直持续到 EXEC命令。
127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> watch key # watch 监控了key
OK
127.0.0.1:6379> set key 2
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key 3 # 在事务中尝试修改key
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get key # 获取key的值,发现在事务中修改的key值并没有成功
"2"
执行EXEC命令后会取消对所有键的监控。如果不想执行事务,且取消监控,可以使用unwatch
参考书籍 redis入门指南