1、簡介 Redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證: 批量操作在發送 EXEC 命令前被放入隊列緩存。 收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。 在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。 一個事務從開始 ...
1、簡介
Redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:
- 批量操作在發送 EXEC 命令前被放入隊列緩存。
- 收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。
- 在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
一個事務從開始到執行會經歷以下三個階段:
- 開始事務。
- 命令入隊。
- 執行事務。
1、Redis會將一個事務中的所有命令序列化,然後按順序執行
2、執行中不會被其他命令插入,不允許出現加塞行為
2、命令
下表列出了 redis 事務的相關命令:
序號 |
命令及描述 |
1 |
DISCARD |
2 |
EXEC |
3 |
MULTI |
4 |
UNWATCH |
5 |
WATCH key [key ...] |
3、示例
3.1. 示例1:MULTI EXEC
功能需求:A向B賬號轉賬50元,原始A賬號餘額是80元,B賬戶餘額是10元。
一個事務的例子,它先以MULTI開始一個事務,然後將多個命令入隊到事務中,最後由EXEC命令觸發事務。
3.2. 示例2:DISCARD放棄隊列執行
通過discard命令進行rollback的操作,就是回滾事務。
3.3. 示例3:事務的錯誤處理
事務的錯誤處理:
如果某個命令爆出來錯誤,則只有報錯的命令不會被執行,而其他的命令都會執行,不會回滾。
我們發現,incy hello 命令會出錯,因為他將字元串-1操作。
但是這個命令也是在事務裡面(事務隊列裡面),雖然他執行失敗了,但是沒影響別的命令的執行。
3.4. 示例4:事務的錯誤處理
事務的錯誤處理:
隊列中的某個命令出現了報告錯誤,執行時整個的所有隊列都會被取消。
由於之前的錯誤,導致事務回滾。
即運行時異常和編譯錯誤時。
3.5. 示例5:事務的WATCH
WATCH key [key ...]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷,回滾。
需求:某一賬戶在一事務中進行操作,在提交事務前,另一個進程對該賬戶進行操作。
(客戶端1進行賬戶減10的操作,在事務中,註意是在watch監視中)
(客戶端2在客戶端1未執行事務的時候,就減去了賬戶的100元)
(客戶端1此時執行exec,發現事務沒有執行成功,回滾了。。)
3.6. 示例6:事務的UNWATCH
UNWATCH
取消 WATCH 命令對所有 key 的監視。
這個命令用的少,因為在執行WATCH命令後,執行exec和discard命令後會自動執行unwatch,不需要自己主動執行unwatch
4、應用場景
一組命令必須同時都執行,或者都不執行。
我們想保證一組命令在執行過程之中不被其他命令插入。
商品秒殺(活動)。