您的位置:首页 > 数据库 > Redis

Redis事务

2016-12-01 14:32 190 查看

Redis事务

MULTI EXEC

Redis中的事务(transaction)是一组命令的集合。事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。multi就是生成事务,然后输入redis命令,最后用exec执行命令。

redis>MULTI
OK
redis>SADD "user:1:following" 2
QUEUED
redis>SADD "user:2:followers" 1
QUEUED
redis>EXEC
1) (integer) 1
2) (integer) 1


错误处理

如果一个事务中的某个命令执行出错,Redis会怎样处理呢?

(1)语法错误。语法错误指命令不存在或者命令参数的个数不对。

语法错误时,事务不会被执行,其中的正确指令也不会被执行。(2.6.5版本前会执行正确指令)

比如:

redis>MULTI
OK
redis>SET key value
QUEUED
redis>SET key
(error)ERR wrong number of arguments for 'set' command
redis> ERRORCOMMAND key
(error) ERR unknown command 'ERRORCOMMAND'
redis> EXEC
(error) EXECABORT Transaction discarded because of previous errors.


(2)运行错误。运行错误指在命令执行时出现的错误,比如使用散列类型的命令操作集合类型的键,这种错误在实际执行之前Redis是无法发现的,所以在事务里这样的命令是会被Redis接受并执行的。

运行错误时,正确的指令会被执行。

redis>MULTI
OK
redis>SET key 1
QUEUED
redis>SADD key 2
QUEUED
redis>SET key 3
QUEUED
redis>EXEC
1) OK
2) (error) ERR Operation against a key holding the wrong kind of value
3) OK
redis>GET key
"3"


Redis不支持回滚功能,使得Redis在事务上可以保持简洁和快速。redis的理念是这两种错误不应该出现,因此没必要为这种问题浪费性能。

WATCH

用了multi和exec指令后,可以保证一组指令一起执行,但是如何保证其他client在事务执行过程中不修改这些值呢?redis提供了WATCH指令,监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值),如:

redis>SET key 1
OK
redis>WATCH key
OK
redis>SET key 2
OK
redis>MULTI
OK
redis>SET key 3
QUEUED
redis>EXEC
(nil)
redis>GET key
"2"


疑问:有没有这样的功能,当我要执行事务时,相关的key被锁定,不允许其他client读写,直到事务完成或失败才释放锁?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis 事务