discard命令和 multi命令一塊兒使用 redis
127.0.0.1:6379> discard (error) ERR DISCARD without MULTI
WATCH命令監控bash
WATCH 使得 EXEC 命令須要有條件地執行: 事務只能在全部被監視鍵都沒有被修改的前提下執行, 若是這個前提不能知足的話,事務就不會被執行。服務器
WATCH 命令能夠被調用屢次。 對鍵的監視從 WATCH 執行以後開始生效, 直到調用 EXEC 爲止。spa
當 EXEC 被調用時, 無論事務是否成功執行, 對全部鍵的監視都會被取消。code
另外, 當客戶端斷開鏈接時, 該客戶端對鍵的監視也會被取消。htm
使用無參數的 UNWATCH 命令能夠手動取消對全部鍵的監視。對於一些須要改動多個鍵的事務, 有時候程序須要同時對多個鍵進行加鎖, 而後檢查這些鍵的當前值是否符合程序的要求。 當值達不到要求時, 就可使用 UNWATCH 命令來取消目前對鍵的監視, 中途放棄這個事務, 並等待事務的下次嘗試。事務
WATCH命令提供的CAS機制,在被watch的鍵被修改後,執行事務失敗ip
WATCH 命令能夠爲 Redis 事務提供 check-and-set (CAS)行爲。get
多客戶端同時對tkey進行事務監控,當watch鍵命令後,鍵存在被修改的操做,則事務放棄執行
# 事務操做一 127.0.0.1:6379> watch tkey OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tkey 2 QUEUED 127.0.0.1:6379> exec (nil) # 事務操做二 127.0.0.1:6379> watch tkey OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tkey 1 QUEUED 127.0.0.1:6379> exec (nil)
執行unwatch取消對全部鍵的監控,事務放棄執行
# 事務操做一 127.0.0.1:6379> watch tkey OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tkey 100 QUEUED 127.0.0.1:6379> unwatch QUEUED 127.0.0.1:6379> exec (nil) 127.0.0.1:6379> get tkey "10" # 事務操做二 127.0.0.1:6379> watch tkey OK 127.0.0.1:6379> set tkey 10 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set tkey 20 QUEUED 127.0.0.1:6379> exec (nil)
事務執行的原子性
事務是一個單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。
事務是一個原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。
當使用 AOF 方式作持久化的時候, Redis 會使用單個
write(2)
命令將事務寫入到磁盤中。然而,若是 Redis 服務器由於某些緣由被管理員殺死,或者趕上某種硬件故障,那麼可能只有部分事務命令會被成功寫入到磁盤中。若是 Redis 在從新啓動時發現 AOF 文件出了這樣的問題,那麼它會退出,並彙報一個錯誤。
使用
redis-check-aof
程序能夠修復這一問題:它會移除 AOF 文件中不完整事務的信息,確保服務器能夠順利啓動。
事務發生錯誤redis處理狀況
對於發生在 EXEC 執行以前的錯誤,客戶端之前的作法是檢查命令入隊所得的返回值:若是命令入隊時返回
QUEUED
,那麼入隊成功;不然,就是入隊失敗。若是有命令在入隊時失敗,那麼大部分客戶端都會中止並取消這個事務。不過,從 Redis 2.6.5 開始,服務器會對命令入隊失敗的狀況進行記錄,並在客戶端調用 EXEC 命令時,拒絕執行並自動放棄這個事務。
在 Redis 2.6.5 之前, Redis 只執行事務中那些入隊成功的命令,而忽略那些入隊失敗的命令。 而新的處理方式則使得在流水線(pipeline)中包含事務變得簡單,由於發送事務和讀取事務的回覆都只須要和服務器進行一次通信。
至於那些在 EXEC 命令執行以後所產生的錯誤, 並無對它們進行特別處理: 即便事務中有某個/某些命令在執行時產生了錯誤, 事務中的其餘命令仍然會繼續執行。
redis提供的腳本實現方式相對於事務方式要更簡單和快速
從定義上來講, Redis 中的腳本自己就是一種事務, 因此任何在事務裏能夠完成的事, 在腳本里面也能完成。 而且通常來講, 使用腳本要來得更簡單,而且速度更快。
參考資料:
http://redisdoc.com/topic/transaction.html