当前位置:嗨网首页>书籍在线阅读

04-错误处理

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

4.1.2 错误处理

Redis 2.6.5之前的版本会忽略有语法错误的命令,然后执行事务中其他语法正确的命令。就此例而言, SET key value 会被执行, EXEC 命令会返回一个结果:

有些读者会有疑问,如果一个事务中的某个命令执行出错,Redis 会怎样处理呢?要回答这个问题,首先需要知道什么原因会导致命令执行出错。

1) OK

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

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.

跟在 MULTI 命令后执行了3个命令:一个是正确的命令,成功地加入事务队列;其余两个命令都有语法错误。而只要有一个命令有语法错误,执行 EXEC 命令后Redis就会直接返回错误,连语法正确的命令也不会执行。

版本差异

(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) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
redis> GET key "3"

可见虽然 SADD key 2 出现了错误,但是 SET key 3 依然执行了。

Redis的事务没有关系数据库事务提供的回滚(rollback)1功能。为此开发者必须在事务执行出错后自己收拾剩下的摊子(将数据库复原回事务执行前的状态等)。

1事务回滚是指将一个事务已经完成的对数据库的修改操作撤销。

不过由于Redis不支持回滚功能,也使得Redis在事务上可以保持简洁和快速。另外回顾刚才提到的会导致事务执行失败的两种错误,其中语法错误完全可以在开发时找出并解决,另外如果能够很好地规划数据库(保证键名规范等)的使用,是不会出现如命令与数据类型不匹配这样的运行错误的。