1. 程式人生 > >redis 的事務機制

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命令。