Redis事務的簡單理解


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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM