天天看點

redis事務處理:(error) EXECABORT Transaction discarded because of previous errors.

4.1.2 錯誤處理

有些讀者會有疑問,如果一個事務中的某個指令執行出錯,Redis 會怎樣處理呢?要回答這個問題,首先需要知道什麼原因會導緻指令執行出錯。

(1)文法錯誤。文法錯誤指指令不存在或者指令參數的個數不對。比如:

  1. redis> MULTI
  2. OK
  3. redis> SET key value
  4. QUEUED
  5. redis> SET key
  6. (error) ERR wrong number of arguments for 'set' command
  7. redis> ERRORCOMMAND key
  8. (error) ERR unknown command 'ERRORCOMMAND'
  9. redis> EXEC
  10. (error) EXECABORT Transaction discarded because of previous errors.

跟在MULTI指令後執行了3個指令:一個是正确的指令,成功地加入事務隊列;其餘兩個指令都有文法錯誤。而隻要有一個指令有文法錯誤,執行EXEC指令後Redis就會直接傳回錯誤,連文法正确的指令也不會執行 。

(2)運作錯誤。運作錯誤指在指令執行時出現的錯誤,比如使用散列類型的指令操作集合類型的鍵,這種錯誤在實際執行之前Redis是無法發現的,是以在事務裡這樣的指令是會被Redis接受并執行的。如果事務裡的一條指令出現了運作錯誤,事務裡其他的指令依然會繼續執行(包括出錯指令之後的指令),示例如下:

  1. redis> MULTI
  2. OK
  3. redis> SET key 1
  4. QUEUED
  5. redis> SADD key 2
  6. QUEUED
  7. redis> SET key 3
  8. QUEUED
  9. redis> EXEC
  10. 1) OK
  11. 2) (error) ERR Operation against a key holding the wrong kind of value
  12. 3) OK
  13. redis> GET key
  14. "3"

可見雖然SADD key 2出現了錯誤,但是SET key 3依然執行了。

繼續閱讀