# Redis (四) - Transaction Redis Transaction 可以一次執行多條命令,並且具有以下規範以保證執行無誤。 * 批次的操作在傳送 EXEC 命令前會被放在 Queue * 收到 EXEC 命令後就會開始執行 Transaction,Transaction 中的命令若有失敗則不影響其他命令繼續執行,也就是說 Redis Transaction 不保證操作原子性。 * 在 Transaction 執行過程中,其他客戶端提交的命令不會插入到 Transaction 的命令列中。 Transaction 的多條命令是被一次性的發送給伺服器而不是一條一條的傳送,這樣的方式可以減少客戶端與伺服器之間的網路通訊次數以提升效能。 <!-- more --> 下面我們就開始介紹實作 Transaction 的指令和方法。 ## Transaction 指令 ### Multi Multi 是用來標記 Transaction 的開始。 ```bash= 127.0.0.1:6379> multi ``` ### Exec Exec 是用來執行 Transaction。 ```bash= 127.0.0.1:6379> exec ``` 範例 : ```bash= 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tk1 tv1 QUEUED 127.0.0.1:6379> set tk2 tv2 QUEUED 127.0.0.1:6379> set tk3 tv3 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK 3) OK ``` ### Discard Discard 用於取消 Transaction。 ```bash= 127.0.0.1:6379> discard ``` 範例 : ```bash= 127.0.0.1:6379> set tk1 tv1 QUEUED 127.0.0.1:6379> set tk2 tv2 QUEUED 127.0.0.1:6379> discard OK ``` ### Watch Watch 用於監視一個或多個 Key,若 Key 已經放進 Transaction Queue 且還未執行時被其他命令改動,則 Transaction 會被中斷。 ```bash= 127.0.0.1:6379> watch <key1> <key2> ... ``` 範例 : 先對 key 進行監視。 ```bash= 127.0.0.1:6379> watch tk1 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tk1 5 QUEUED ``` 在此時另外開一個 terminal 並且連線到 Redis。接著將 被監視的 key 進行修改。 ```bash= 127.0.0.1:6379> set tk1 20 OK ``` 再回到原本的 terminal 完成 Transaction 並輸入 exec,可以發現回傳 nil,代表 Transaction 被中斷失敗了。 ```bash= 127.0.0.1:6379> set tk2 10 QUEUED 127.0.0.1:6379> exec (nil) ``` ### Unwatch Unwatch 用於解除對所有的 Key 的監視。 ```bash= 127.0.0.1:6379> unwatch ``` ## Summary 這一篇介紹了 Redis Transaction,若命令很多可以使用 Transaction 來減少和伺服器間的網路通訊以提升效能。 [下一篇](https://tienyulin.github.io/redis-server-management)將要介紹如何管理 Redis Server。 ## 參考 [1] [Redis 事務](https://www.runoob.com/redis/redis-transactions.html) [2] [Redis Transaction](http://doc.redisfans.com/transaction/index.html) ###### tags: `Redis`