# Redis 事務命令multi,exec,watch,unwatch,discard
語法錯誤前期的執行不會被回滾,錯誤不應該出現在正式環境中。
不像mysql的事務完全回滾。
Redis 事務可以一次執行多個命令, 并且帶有以下三個重要的保證:
* 批量操作在發送 EXEC 命令前被放入隊列緩存。
* 收到 EXEC 命令后進入事務執行,事務中任意命令執行失敗,其余的命令依然被執行。
* 在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
一個事務從開始到執行會經歷以下三個階段:
* 開始事務。
* 命令入隊。
* 執行事務。
* * *
## 實例
以下是一個事務的例子, 它先以**MULTI**開始一個事務, 然后將多個命令入隊到事務中, 最后由**EXEC**命令觸發事務, 一并執行事務中的所有命令:
~~~
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
~~~
單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執行并不是原子性的。
事務可以理解為一個打包的批量執行腳本,但批量指令并非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成后續的指令不做。
> **這是官網上的說明 From redis docs on[transactions](http://redis.io/topics/transactions):**
>
> It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
比如:
~~~
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
~~~
如果在 set b bbb 處失敗,set a 已成功不會回滾,set c 還會繼續執行。
* * *
## Redis 事務命令
下表列出了 redis 事務的相關命令:
| 序號 | 命令及描述 |
| --- | --- |
| 1 | [DISCARD](https://www.runoob.com/redis/transactions-discard.html)
取消事務,放棄執行事務塊內的所有命令。 |
| 2 | [EXEC](https://www.runoob.com/redis/transactions-exec.html)
執行所有事務塊內的命令。 |
| 3 | [MULTI](https://www.runoob.com/redis/transactions-multi.html)
標記一個事務塊的開始。 |
| 4 | [UNWATCH](https://www.runoob.com/redis/transactions-unwatch.html)
取消 WATCH 命令對所有 key 的監視。 |
| 5 | [WATCH key \[key ...\]](https://www.runoob.com/redis/transactions-watch.html)
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。 |
- PHP
- php 簡單語法
- php 語法
- PHP書寫歸范總結
- 代碼縮進
- 變量賦值時候
- if條件判斷
- 避免嵌入式賦值
- 函數和方法的注釋
- php 開發常見問題總結
- 1、查找兩個經緯度之間的距離
- 2、PHP常量詳解:define和const的區別
- 3、常見面試題及特殊情況
- mysql
- MySQL 介紹
- MySQL 及 SQL 注入
- mysql常見問題
- MySQL數據類型
- MySQL where語句
- MySQL alter 命令
- MySQL 索引
- MySQL 復制表
- MySQL 處理重復數據
- redis
- redis介紹
- redis數據類型(共5種 )
- redis常見問題及使用場景
- redis事務
- Redis 分區
- Linux
- Linux介紹
- Linux 系統目錄結構
- Linux 文件與目錄管理
- shell
- Shell 教程介紹
- html+css+js
- 優秀技術文章
- 技術鏈接
- go語言
- go開發規范及注意事項
- go簡單語法
- go開發技術總結
- 博客
- 小程序
- 1、頁面跳轉