4.1.2 錯誤處理
有些讀者會有疑問,如果一個事務中的某個指令執行出錯,Redis 會怎樣處理呢?要回答這個問題,首先需要知道什麼原因會導緻指令執行出錯。
(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) ERR Operation against a key holding the wrong kind of value
- 3) OK
- redis> GET key
- "3"
可見雖然SADD key 2出現了錯誤,但是SET key 3依然執行了。