redis 的事務機制
Redis的事務實質上是命令的集合,在一個事務中要麼所有命令都被執行,要麼所有命令都不執行。 redis 事務的一個流程是,通過multi命令開始事務,multi之後的命令將逐個加入到一個佇列,直到使用EXEC命令,這個命令使用後,就會逐個執行佇列裡的命令。
.Redis的事務沒有關係資料庫事務提供的回滾(rollback),所以開發者必須在事務執行失敗後進行後續的處理;
如果在一個事務中的命令出現錯誤,那麼所有的命令都不會執行(即一個命令可能會在被放入佇列時失敗。因此,事務有可能在呼叫EXEC命令之前就發生錯誤。例如,這個命令可能會有語法錯誤(引數的數量錯誤、命令名稱錯誤,等等),或者可能會有某些臨界條件(例如:如果使用maxmemory指令,為Redis伺服器配置記憶體限制,那麼就可能會有記憶體溢位條件
如果在一個事務中出現執行錯誤,那麼正確的命令會被執行。(即在呼叫EXEC命令之後,事務中的某個命令可能會執行失敗。例如,我們對某個鍵執行了錯誤型別的操作(例如,對一個字串(String)型別的鍵執行列表(List)型別的操作)。)
1. MULTI
用於標記事務塊的開始。Redis會將後續的命令逐個放入佇列中,然後才能使用EXEC命令原子化地執行這個命令序列。
2. EXEC
在一個事務中執行所有先前放入佇列的命令,然後恢復正常的連線狀態。
當使用WATCH命令時,只有當受監控的鍵沒有被修改時,EXEC命令才會執行事務中的命令,這種方式利用了檢查再設定(CAS)的機制。
3. DISCARD
清除所有先前在一個事務中放入佇列的命令,然後恢復正常的連線狀態。
如果使用了WATCH命令,那麼DISCARD命令就會將當前連線監控的所有鍵取消監控。
4. WATCH
當某個事務需要按條件執行時,就要使用這個命令將給定的鍵設定為受監控的。
WATCH命令可以監控一個或多個鍵,一旦其中有一個鍵被修改(或刪除),之後的事務就不會執行,監控一直持續到EXEC命令。
5. UNWATCH
清除所有先前為一個事務監控的鍵。
如果你呼叫了EXEC或DISCARD命令,那麼就不需要手動呼叫UNWATCH命令。