Redis事務的命令如下所示:
先以 MULTI 開始一個事務, 然后將多個命令入隊到事務中, 最后由 EXEC 命令觸發事務, 一並執行事務中的所有命令
示例如下:
//開始一個事務 127.0.0.1:6379> MULTI OK //將3個元素添加到集合set-test中 127.0.0.1:6379> SADD set-test c java c++ QUEUED //遍歷set-test集合 127.0.0.1:6379> SMEMBERS set-test QUEUED
//觸發事務 127.0.0.1:6379> EXEC 1) (integer) 3 2) 1) "c++" 2) "java" 3) "c" 127.0.0.1:6379>
Redis 事務可以一次執行多個命令, 並且帶有以下特征:
- 批量操作在發送 EXEC 命令前被放入隊列緩存。
- 收到 EXEC 命令后進入事務執行,事務中任意命令執行失敗,其余的命令依然被執行。
- 在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
注意:Redis的事務沒有關系數據庫事務提供的回滾(rollback) 功能,因此必須在事務執行出錯后進行處理(比如將數據庫復原回事務執行前的狀態等)。
由於Redis不支持回滾功能,也使得Redis在事務上可以保持簡潔和快速。
因此,在Redis事務中會出現兩類錯誤:
1.命令語法錯誤、參數錯誤等,命令沒有進入事務的命令隊列,直接就返回錯誤。
2.命令進入事務的命令隊列,但在執行EXEC后出錯,例如對錯誤的數據類型使用了不支持的操作。
客戶端可以在事務提交前就感知到第一類錯誤,一般客戶端在收到第一類錯誤時會discard當前事務。
Redis2.6.5之前的版本在執行EXEC時會忽略第一類錯誤,執行隊列中的其他命令。
Redis2.6.5之后的版本會記錄第一類錯誤,當執行EXEC命令時返回:
(error) EXECABORT Transaction discarded because of previous errors.
對於第二類錯誤,Redis會忽略失敗的命令,繼續執行隊列中的其他命令。即一個事務內的操作,可能會出現一部分成功,一部分失敗的情況。
第一類錯誤,如下所示:
//開始一個事務 127.0.0.1:6379> MULTI OK //將3個元素添加到集合set-test中 127.0.0.1:6379> SADD set-test c java c++ QUEUED //遍歷set-test集合的命令出錯 127.0.0.1:6379> SMEMBERS (error) ERR unknown command 'SMEM' //正確的遍歷命令 127.0.0.1:6379> SMEMBERS set-test QUEUED 127.0.0.1:6379> //觸發事務不成功 127.0.0.1:6379> EXEC (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379>